我正在将基于套接字的应用程序从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));
我搜索了可能的移植实现,并且可以找到这两个相关的线程。 documentation和 setsockopt() with RCVTIMEO is not working in windows mobile5
将接收超时设置为200ms后,调用recv()以从远程IP(发送方)接收数据。 第一个链接清楚地解释了产生一个线程并等待它,但200ms看起来太少了我的情况,因为发送者发送约10秒。 第二个链接的select()建议是我添加到我的代码但行为非常不一致。有时它不接收数据包,有时1或有时更多。但是现有的实现在Linux上运行良好。
我正在以正确的方式进行移植吗?任何人都可以指出可能的错误或提出建议吗?
谢谢!
答案 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。
希望这是有帮助的