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;
}
Exemple #2
0
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);
}