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:
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
Kasse, ist der timeout legt in Sekunden oder Minuten. Ich denke, es muss in Sekunden nicht in Minuten.
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.
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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist per defintion.
Wörtlich aus MSDN:
InformationsquelleAutor alk
Ist das problem mit dem tv.tv_usec; tv_usec als pro-Mann-Seite ist vom Typ "long". Der Wert (2400000000) aus der Reichweite der langen und das ist der Grund, warum Sie immer so wählen Sie system-Verhalten.
Wenn Sie möchten, wählen Sie warten, für 40 min, dann stellen Sie sicher, Sie sind mit tv.tv_sec.
Ich Frage mich, ob tv_usec=2147483647 wirklich würde führen zu einem time-out von 2147s, aber 0.483647 s ... - keine win32 verfügbar jetzt prüfen.
InformationsquelleAutor Viswesn