SOCK_SOCKET RTIP_SOCKETS_Driver::Accept( SOCK_SOCKET socket, SOCK_sockaddr* address, int* addressLen ) { SOCK_SOCKET ret = SOCK_SOCKET_ERROR; int type = RTP_NET_TYPE_IPV4; unsigned long addr = address == NULL? 0: ((SOCK_sockaddr_in *) address)->sin_addr.S_un.S_addr; int port = address == NULL? 0: ((SOCK_sockaddr_in *) address)->sin_port; rtp_net_accept ((RTP_SOCKET *) &ret, (RTP_SOCKET) socket, (unsigned char*)&addr, &port, &type); if(address) { ((SOCK_sockaddr_in *) address)->sin_addr.S_un.S_addr = addr; ((SOCK_sockaddr_in *) address)->sin_port = port; ((SOCK_sockaddr_in *) address)->sin_family = RTP_NET_AF_INET; } return ret; }
RTSMB_STATIC PNET_SESSIONCTX rtsmb_srv_net_connection_open (PNET_THREAD pThread) { PNET_SESSIONCTX pNetCtx; RTP_SOCKET sock; unsigned char clientAddr[4]; int clientPort; int ipVersion; /** * Move connection to a shiny new port and socket. */ RTSMB_DEBUG_OUTPUT_STR("about to accept\n", RTSMB_DEBUG_TYPE_ASCII); if (rtp_net_accept ((RTP_SOCKET *) &sock,(RTP_SOCKET) net_ssnSock, clientAddr, &clientPort, &ipVersion) < 0) { RTSMB_DEBUG_OUTPUT_STR("rtsmb_srv_net_connection_open: accept error\n", RTSMB_DEBUG_TYPE_ASCII); return (PNET_SESSIONCTX)0; } pNetCtx = allocateSession(); RTSMB_DEBUG_OUTPUT_STR("allocateSession back\n", RTSMB_DEBUG_TYPE_ASCII); if(pNetCtx) { pNetCtx->sock = sock; RTSMB_DEBUG_OUTPUT_STR("SMBS_InitSessionCtx\n", RTSMB_DEBUG_TYPE_ASCII); pNetCtx->lastActivity = rtp_get_system_msec (); SMBS_InitSessionCtx(&(pNetCtx->smbCtx), pNetCtx->sock); RTSMB_DEBUG_OUTPUT_STR("Back SMBS_InitSessionCtx\n", RTSMB_DEBUG_TYPE_ASCII); SMBS_SetBuffers (&pNetCtx->smbCtx, pThread->inBuffer, prtsmb_srv_ctx->small_buffer_size, pThread->outBuffer, prtsmb_srv_ctx->small_buffer_size, pThread->tmpBuffer, prtsmb_srv_ctx->small_buffer_size); RTSMB_DEBUG_OUTPUT_STR ("rtsmb_srv_net_connection_open: socket ", RTSMB_DEBUG_TYPE_ASCII); RTSMB_DEBUG_OUTPUT_DINT (pNetCtx->sock); RTSMB_DEBUG_OUTPUT_STR (" opened\n", RTSMB_DEBUG_TYPE_ASCII); return pNetCtx; } else { RTSMB_DEBUG_OUTPUT_STR("rtsmb_srv_net_connection_open: No free sessions\n", RTSMB_DEBUG_TYPE_ASCII); /* let them know we are rejecting their request */ rtsmb_srv_nbss_send_session_response (sock, FALSE); if (rtp_net_closesocket((RTP_SOCKET) sock)) { RTSMB_DEBUG_OUTPUT_STR("ERROR IN CLOSESOCKET\n", RTSMB_DEBUG_TYPE_ASCII); } return (PNET_SESSIONCTX)0; } }
/** @memo Wait for a client to connect and process one request. @doc This function must be called to serve content. It processes one HTTP POST, PUT or GET request and then returs. In a multithreaded environment a background thread may be created that just calls this function continuously. A singlethreaded application must call this function from the main loop of the program. @return 0 if a request was process, negative if it timed out or failed. */ int HTTP_ServerProcessOneRequest (HTTPServerContext *server, /** Pointer to structure that was initialized by HTTP_ServerInit */ HTTP_INT32 timeoutMsec) /** Time to wait for a connection, 0 is forever */ { RTP_SOCKET sockHandle; RTP_NET_ADDR clientAddr; int result = -1; if (rtp_net_read_select(server->serverSocket, timeoutMsec) < 0) { return (result); } if (rtp_net_accept(&sockHandle, server->serverSocket, clientAddr.ipAddr, &clientAddr.port, &clientAddr.type) < 0) { return (result); } #ifdef HTTP_SERVER_MULTITHREAD { HTTPServerConnection* connectionCtx = server->jobFreeList; if (connectionCtx) { server->jobFreeList = (HTTPServerConnection*) connectionCtx->job.next; connectionCtx->clientAddr = clientAddr; connectionCtx->socket = sockHandle; if (rtp_helper_thread_queue_job(&server->helperContext, &connectionCtx->job) >= 0) { rtp_helper_thread_start_cond(&server->helperContext, server->maxHelperThreads); } result = 0; } else { result = -1; /* do a hard close */ rtp_net_setlinger(sockHandle, 1, 0); rtp_net_closesocket(sockHandle); } } #else /* HTTP_SERVER_SINGLETHREAD */ result = HTTP_ServerProcessOneConnection(server, sockHandle, &clientAddr); #endif /* HTTP_SERVER_MULTITHREAD */ return (result); }