用于Windows CE的端口setsockopt()与RCVTIMEO
问题描述:
我正在将基于套接字的应用程序从Linux移植到Windows CE 6.0。我遇到了一行代码,它为接收超时设置了套接字选项。用于Windows CE的端口setsockopt()与RCVTIMEO
struct timeval timeout = 200; timeout.tv_usec = 200000; setsockopt(mySock, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout, (socklen_t) sizeof(timeout));
我寻找可能的移植实现,并且能找到这两个线程相关的。 setsockopt() with RCVTIMEO is not working in windows mobile5和 Set timeout for winsock recvfrom
设定接收超时为200毫秒之后,存在到的recv()的调用,用于从远程IP(发送者)接收数据。 清楚地解释第一个链接产生一个线程并等待它,但200ms看起来太少,因为发件人发送约10秒。 第二个链接的select()建议是我添加到我的代码中的,但行为非常不一致。有时它不会收到数据包,有时会收到1个,有时甚至更多但现有的实现在Linux上正常工作。
我在做正确的移植吗?任何人都可以指出可能的错误或提出建议吗?
谢谢!
答
我认为“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的选择。
希望这有帮助
您是否考虑添加一些错误检查?例如到'setsockopt()'调用? – EJP