Exemplo n.º 1
0
static void web_server_accept(SOCKET lsock, fd_set *set)
{
#ifdef INTERNAL_WEB_SERVER
	SOCKET asock;
	socklen_t clientLen;
	struct sockaddr_storage clientAddr;
	char errorBuffer[ERROR_BUFFER_LEN];

	if (lsock != INVALID_SOCKET && FD_ISSET(lsock, set)) {
		clientLen = sizeof(clientAddr);
		asock = accept(lsock, (struct sockaddr *)&clientAddr,
			&clientLen);
		if (asock == INVALID_SOCKET) {
			strerror_r(errno, errorBuffer, ERROR_BUFFER_LEN);
			UpnpPrintf(UPNP_INFO, MSERV, __FILE__, __LINE__,
				"miniserver: Error in accept(): %s\n",
				errorBuffer);
		} else {
			schedule_request_job(asock,
				(struct sockaddr *)&clientAddr);
		}
	}
#endif /* INTERNAL_WEB_SERVER */
}
Exemplo n.º 2
0
/************************************************************************
 * Function: RunMiniServer
 *
 * Parameters:
 *	MiniServerSockArray *miniSock - Socket Array
 *
 * Description:
 * 	Function runs the miniserver. The MiniServer accepts a 
 *	new request and schedules a thread to handle the new request.
 *	Checks for socket state and invokes appropriate read and shutdown 
 *	actions for the Miniserver and SSDP sockets 
 *
 * Return: void
 ************************************************************************/
static void
RunMiniServer( MiniServerSockArray * miniSock )
{
    struct sockaddr_in clientAddr;
    socklen_t clientLen;
    SOCKET connectHnd;
    SOCKET miniServSock = miniSock->miniServerSock;
    SOCKET miniServStopSock =  miniSock->miniServerStopSock;
    SOCKET ssdpSock = miniSock->ssdpSock;
#ifdef INCLUDE_CLIENT_APIS
    SOCKET ssdpReqSock = miniSock->ssdpReqSock;
#endif

    fd_set expSet;
    fd_set rdSet;
    int maxMiniSock;
    int byteReceived;
    char requestBuf[256];

    maxMiniSock = max( miniServSock, miniServStopSock) ;
    maxMiniSock = max( maxMiniSock, (SOCKET)(ssdpSock) );
#ifdef INCLUDE_CLIENT_APIS
    maxMiniSock = max( maxMiniSock, (SOCKET)(ssdpReqSock) );
#endif
    ++maxMiniSock;

    gMServState = MSERV_RUNNING;
    while( TRUE ) {
        FD_ZERO( &rdSet );
        FD_ZERO( &expSet );

        FD_SET( miniServStopSock, &expSet );
        FD_SET( miniServSock, &rdSet );
        FD_SET( miniServStopSock, &rdSet );
        FD_SET( ssdpSock, &rdSet );
#ifdef INCLUDE_CLIENT_APIS
        FD_SET( ssdpReqSock, &rdSet );
#endif

        if( select( maxMiniSock, &rdSet, NULL, &expSet, NULL ) ==
            DLNA_SOCKETERROR ) {
            dlnaPrintf( DLNA_CRITICAL, SSDP, __FILE__, __LINE__,
                "Error in select call!\n" );
	    /* Avoid 100% CPU in case of repeated error in select() */
	    isleep( 1 );
            continue;
        } else {
            if( FD_ISSET( miniServSock, &rdSet ) ) {
                clientLen = sizeof( struct sockaddr_in );
                connectHnd = accept( miniServSock,
                    ( struct sockaddr * )&clientAddr, &clientLen );
                if( connectHnd == DLNA_INVALID_SOCKET ) {
                    dlnaPrintf( DLNA_INFO, MSERV, __FILE__, __LINE__,
                        "miniserver: Error in accepting connection\n" );
                    continue;
                }
                schedule_request_job( connectHnd, &clientAddr );
            }
#ifdef INCLUDE_CLIENT_APIS
            // ssdp
            if( FD_ISSET( ssdpReqSock, &rdSet ) ) {
                readFromSSDPSocket( ssdpReqSock );
            }
#endif
            if( FD_ISSET( ssdpSock, &rdSet ) ) {
                    readFromSSDPSocket( ssdpSock );
            }
            if( FD_ISSET( miniServStopSock, &rdSet ) ) {
                clientLen = sizeof( struct sockaddr_in );
                memset( ( char * )&clientAddr, 0,
                        sizeof( struct sockaddr_in ) );
                byteReceived =
                    recvfrom( miniServStopSock, requestBuf, 25, 0,
                              ( struct sockaddr * )&clientAddr,
                              &clientLen );
                if( byteReceived > 0 ) {
                    requestBuf[byteReceived] = '\0';
                    dlnaPrintf( DLNA_INFO, MSERV, __FILE__, __LINE__,
                        "Received response !!!  %s From host %s \n",
                        requestBuf, inet_ntoa( clientAddr.sin_addr ) );
                    dlnaPrintf( DLNA_PACKET, MSERV, __FILE__, __LINE__,
                        "Received multicast packet: \n %s\n",
                        requestBuf );
                    if( NULL != strstr( requestBuf, "ShutDown" ) ) {
                        break;
		    }
                }
            }
        }
    }

    shutdown( miniServSock, SD_BOTH );
    dlnaCloseSocket( miniServSock );
    shutdown( miniServStopSock, SD_BOTH );
    dlnaCloseSocket( miniServStopSock );
    shutdown( ssdpSock, SD_BOTH );
    dlnaCloseSocket( ssdpSock );
#ifdef INCLUDE_CLIENT_APIS
    shutdown( ssdpReqSock, SD_BOTH );
    dlnaCloseSocket( ssdpReqSock );
#endif

    free( miniSock );
    gMServState = MSERV_IDLE;

    return;
}