Einstellung winsock wählen Sie timeout genau

Ich versuche, meine Gespräch annehmen timeout nach einer festgelegten Zeit, und ich habe versucht, nach dem Vorschlag hier:

Winsock akzeptieren timeout

in dem Fall gebe ich eine struct TIMEVAL zu wählen, wenn ich es nennen, problem ist wenn ich den tv.tv_usec zu sagen, um 40 Minuten oder so, die wählen Sie call mal sofort, anstatt zu warten, für die 40 Minuten, die ich angegeben. MSDN besagt, dass die Zeitüberschreitung für wählen, ist die maximale Zeit, die Sie warten, wie mache ich es so, dass wählen Sie, oder übernehmen für diese Angelegenheit wartet für eine bestimmte Zeit vor dem timing aus?

#define WIN32_LEAN_AND_MEAN

#include <Windows.h>

#include <WinSock2.h>
#include <Ws2tcpip.h>

#include <cstdio>
#include <tchar.h>

VOID _tmain( int argc, TCHAR *argv[] )
{
    WSADATA wsaData = { 0 };
    ADDRINFOA hINTs = { 0 };
    PADDRINFOA pResult = NULL;
    SOCKET hServerSocket = INVALID_SOCKET,
           hClientSocket = INVALID_SOCKET;
    TIMEVAL tv = { 0 };
    INT iReturnStatus = -1;
    DWORD dwRecvTimeout = 30000, //Milliseconds
          dwSendTimeout = 30000; //Milliseconds
    fd_set readFDs = { 0 };

    if ( WSAStartup( MAKEWORD( 2, 2 ), &wsaData ) )
    {
        _tprintf_s( TEXT( "WSAStartup Failed\n" ) );
        return;
    }

    ZeroMemory( &hINTs, sizeof( hINTs ) );
    hINTs.ai_family = AF_INET;
    hINTs.ai_socktype = SOCK_STREAM;
    hINTs.ai_protocol = IPPROTO_TCP;
    hINTs.ai_flags = AI_PASSIVE;
    if ( getaddrinfo( NULL, TEXT( "9001" ), &hINTs, &pResult ) )
    {
        WSACleanup();
        _tprintf_s( TEXT( "getaddrinfo Failed\n" ) );
        return;
    }

    if ( ( hServerSocket = socket( pResult -> ai_family, pResult -> ai_socktype, pResult -> ai_protocol ) ) == INVALID_SOCKET )
    {
        freeaddrinfo( pResult );
        WSACleanup();
        _tprintf_s( TEXT( "socket Failed\n" ) );
        return;
    }

    int iResult = bind( hServerSocket, ( pResult -> ai_addr ), pResult -> ai_addrlen );
    if ( iResult == SOCKET_ERROR )
    {
        freeaddrinfo( pResult );
        closesocket( hServerSocket );
        WSACleanup();
        _tprintf_s( TEXT( "bind Failed\n" ) );
        return;
    }
    freeaddrinfo( pResult );

    if ( listen( hServerSocket, SOMAXCONN ) )
    {
        closesocket( hServerSocket );
        WSACleanup();
        _tprintf_s( TEXT( "listen Failed\n" ) );
        return;
    }

    hClientSocket = INVALID_SOCKET;

    for ( ;; )
    {
        tv.tv_usec = 2400000000; //microseconds
        FD_ZERO( &readFDs );
        FD_SET( hServerSocket, &readFDs );
        _tprintf( "select()\n" );
        iReturnStatus = select( 0, &readFDs, NULL, NULL, &tv );

        //Select Error
        if ( iReturnStatus == SOCKET_ERROR )
        {
            _tprintf( "select Failed\n" );
        }
        //Select Success
        else if ( iReturnStatus )
        {
            //Connection Established On Server Socket
            if ( FD_ISSET( hServerSocket, &readFDs ) )
            {
                //Accept Client Connection
                hClientSocket = accept( hServerSocket, NULL, NULL );
                if ( hClientSocket == INVALID_SOCKET )
                {
                    _tprintf( "accept Failed\n" );
                }
                else
                {
                    //Set Recv Timeout
                    setsockopt( hClientSocket, SOL_SOCKET, SO_RCVTIMEO, ( const char * ) &dwRecvTimeout, sizeof( dwRecvTimeout ) );

                    //Set Send Timeout                 
                    setsockopt( hClientSocket, SOL_SOCKET, SO_SNDTIMEO, ( const char * ) &dwSendTimeout, sizeof( dwSendTimeout ) );

                    //Process Client Request(s)
                    //HandleConnection( ClientSocket );
                }
            }
            //Connection Established On Unknown Socket
            else
            {
                _tprintf( "Invalid Socket Returned\n" );
            }
        }
        //Select Timeout
        else
        {
            _tprintf( "select Timeout\n" );
        }

    }
    if ( hServerSocket != INVALID_SOCKET )
        closesocket( hServerSocket );

    return;
}
MSDN sagt max Zeit, weil die select warten endet, wenn der socket nicht blockieren, akzeptieren. Also entweder wählen Sie anrufen, nicht richtig oder eine Verbindung verfügbar ist auf dem socket. Wenn Sie post code, könnte es möglich sein, Ihnen helfen.
Kasse, ist der timeout legt in Sekunden oder Minuten. Ich denke, es muss in Sekunden nicht in Minuten.
tv.tv_usec ist Mikrosekunden, und tv.tv_sec ist Sekunden. Auch, bitte zeigen Sie den code, den Sie verwenden für die Initialisierung der Strukturen/fd_sets und die select nennen.
Weil Sie tv_sec für timeouts GRÖSSER als 1 Sekunde, tv_usec für timeouts WENIGER als 1 Sekunde, und Sie sollten NICHT tv_usec > 1,000,000.
tv.tv_sec = ( timeout_in_microseconds / 1000000 ); tv.tv_usec = ( timeout_in_microseconds % 1000000 );

InformationsquelleAutor shawn | 2012-06-12

Schreibe einen Kommentar