端口setsockopt()与RCVTIMEO for Windows CE

时间:2015-10-12 12:45:27

标签: c sockets windows-ce winsock2

我正在将基于套接字的应用程序从Linux移植到Windows CE 6.0。我遇到了一行代码,它为接收超时设置了套接字选项。

struct timeval timeout = 200; timeout.tv_usec = 200000; setsockopt(mySock, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout, (socklen_t) sizeof(timeout));

我搜索了可能的移植实现,并且可以找到这两个相关的线程。 documentationsetsockopt() with RCVTIMEO is not working in windows mobile5

将接收超时设置为200ms后,调用recv()以从远程IP(发送方)接收数据。 第一个链接清楚地解释了产生一个线程并等待它,但200ms看起来太少了我的情况,因为发送者发送约10秒。 第二个链接的select()建议是我添加到我的代码但行为非常不一致。有时它不接收数据包,有时1或有时更多。但是现有的实现在Linux上运行良好。

我正在以正确的方式进行移植吗?任何人都可以指出可能的错误或提出建议吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

我认为" select()"建议移植你的linux代码是正确的。

我会使用以下代码:

struct timeval tmout;

#ifdef LINUX
//...
#else
while (true)
{

           struct fd_set fds;
           // Set up the file descriptor set.
           FD_ZERO(&fds) ;
           FD_SET(mySock, &fds) ;

           // Set up the struct timeval for the timeout.
           tmout.tv_sec = 0 ;
           tmout.tv_usec = 200000 ;

           // Wait until timeout or data received.

           n = select ( NULL, &fds, NULL, NULL, &tmout ) ;

           if ( n == 0)
           { 
             printf("select() Timeout..\n");
             //return 0 ;
           }
           else if( n == SOCKET_ERROR )
           {
             printf("select() Error!! %d\n", WSAGetLastError());
             //return 1;   
           }
           else
               printf("select() returns %d\n", n);
}
#endif

我在WCE6应用程序中运行相同的代码,它对我来说很好。 如果您在循环中执行此代码并且发件人每10秒发送一次,则应该每隔10秒看一次选择返回n> 0。

希望这是有帮助的