端口setsockopt(),带有用于Windows CE的RCVTIMEO
我正在将一个基于套接字的应用程序从Linux移植到WindowsCE6.0。我遇到了一行代码,它将套接字选项设置为接收超时端口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()从
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()
调用?