端口setsockopt(),带有用于Windows CE的RCVTIMEO

端口setsockopt(),带有用于Windows CE的RCVTIMEO,c,sockets,windows-ce,winsock2,C,Sockets,Windows Ce,Winsock2,我正在将一个基于套接字的应用程序从Linux移植到WindowsCE6.0。我遇到了一行代码,它将套接字选项设置为接收超时 struct timeval timeout=200; timeout.tv_usec=200000; setsockopt(mySock,SOL_SOCKET,SO_RCVTIMEO,(char*)和timeout,(socklen_t)sizeof(timeout)) 我搜索了可能的移植实现,发现这两个线程相关。 及 将接收超时设置为200ms后,将调用recv()从

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

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

我搜索了可能的移植实现,发现这两个线程相关。 及

将接收超时设置为200ms后,将调用recv()从远程IP(发送方)接收数据。 第一个链接清楚地解释了如何生成一个线程并等待它,但对于我的情况,200毫秒看起来太少了,因为发送方发送了约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


希望这有帮助

您是否考虑过添加一些错误检查?e、 g.是否转到
setsockopt()
调用?