2015-10-12 42 views
-1

我正在将基于套接字的应用程序从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 mobile5Set timeout for winsock recvfrom

设定接收超时为200毫秒之后,存在到的recv()的调用,用于从远程IP(发送者)接收数据。 清楚地解释第一个链接产生一个线程并等待它,但200ms看起来太少,因为发件人发送约10秒。 第二个链接的select()建议是我添加到我的代码中的,但行为非常不一致。有时它不会收到数据包,有时会收到1个,有时甚至更多但现有的实现在Linux上正常工作。

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

谢谢!

+0

您是否考虑添加一些错误检查?例如到'setsockopt()'调用? – EJP

回答

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的选择。

希望这有帮助

+0

真的吗? 'struct timeval timeout = 200'对你来说看起来不错? – EJP

+0

我编辑并澄清了我的答案 – salvolds