微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

准确设置winsockselect超时

我试图让我的接受呼叫在特定的时间段后超时,我试着在这里的build议:

Winsock接受超时

在这种情况下,我传递一个TIMEVAL结构来select当我打电话时,问题是当我设置tv.tv_usec约40分钟左右,select呼叫立即超时,而不是等待我指定的40分钟。 MSDN指出,select的超时是它将等待的最长时间,我该如何使select或receive在这个超时之前等待特定的时间?

#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 Failedn" ) ); 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 Failedn" ) ); return; } if ( ( hServerSocket = socket( pResult -> ai_family,pResult -> ai_socktype,pResult -> ai_protocol ) ) == INVALID_SOCKET ) { freeaddrinfo( pResult ); WSACleanup(); _tprintf_s( TEXT( "socket Failedn" ) ); return; } int iResult = bind( hServerSocket,( pResult -> ai_addr ),pResult -> ai_addrlen ); if ( iResult == SOCKET_ERROR ) { freeaddrinfo( pResult ); closesocket( hServerSocket ); WSACleanup(); _tprintf_s( TEXT( "bind Failedn" ) ); return; } freeaddrinfo( pResult ); if ( listen( hServerSocket,SOMAXCONN ) ) { closesocket( hServerSocket ); WSACleanup(); _tprintf_s( TEXT( "listen Failedn" ) ); 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,&tv ); // Select Error if ( iReturnStatus == SOCKET_ERROR ) { _tprintf( "select Failedn" ); } // Select Success else if ( iReturnStatus ) { // Connection Established On Server Socket if ( FD_ISSET( hServerSocket,&readFDs ) ) { // Accept Client Connection hClientSocket = accept( hServerSocket,NULL ); if ( hClientSocket == INVALID_SOCKET ) { _tprintf( "accept Failedn" ); } else { // Set Recv Timeout setsockopt( hClientSocket,SOL_SOCKET,SO_RCVTIMEO,( const char * ) &dwRecvTimeout,sizeof( dwRecvTimeout ) ); // Set Send Timeout setsockopt( hClientSocket,SO_SNDTIMEO,( const char * ) &dwSendTimeout,sizeof( dwSendTimeout ) ); // Process Client Request(s) // HandleConnection( ClientSocket ); } } // Connection Established On UnkNown Socket else { _tprintf( "Invalid Socket Returnedn" ); } } // Select Timeout else { _tprintf( "select Timeoutn" ); } } if ( hServerSocket != INVALID_SOCKET ) closesocket( hServerSocket ); return; }

pthread取消成功,但线程几百年后,无法创build线程

错误:解除指向不完整types的指针

以编程方式closuresMenuStrip

pipe道访问权限setuid程序

如何阅读,理解,分析和debuggingLinux内核恐慌?

找出一个二进制文件是否已经被堆栈粉碎保护编译

你如何获得在Linux中使用的临时文件文件名?

为什么我的剪贴板侦听器被调用两次/应用程序打开两次?

无法加载可执行文件

对于相同的c ++源文件,其gcc可执行文件在Windows中比在Linux中大655倍。 为什么这么多差异?

为什么这样呢?

这是每个定义。

从MSDN逐字:

tv_sec时间间隔,以秒为单位。

tv_usec时间间隔,以微秒为单位。 此值与tv_sec成员结合使用来表示不是秒的倍数的时间间隔

问题是与tv.tv_usec; 手册页中的tv_usec类型为“long”。 值(2400000000) 超出范围,这就是你得到这样的选择系统行为的原因。

如果你想选择等待40分钟,那么确保你使用的是tv.tv_sec。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐