在Windows PC上的阻塞套接字上下文中,如何检查是否有可用数据在调用recv之前进行读取

时间:2019-03-27 18:54:33

标签: c windows sockets

我编写了一个简短的TCP客户端应用程序,以使用阻塞套接字测试SW代理。它运作良好,我对此感到满意。现在,我需要对其进行修改,并且在读取非自定义消息(来自服务器的消息,而不是由客户端发起的消息)时遇到问题,因为recv()会阻塞程序流,直到没有要读取的数据为止。 对我来说,一个好的解决方案可能是找到一种方法,以在调用recv()之前检查是否有可用的数据,或者如果在一定时间内没有要读取的数据,则recv()可能会退出。 因此,我尝试使用此功能:

static bool isDataAvailable(int socket)
{
   fd_set sready;
   struct timeval nowait;

   FD_ZERO(&sready);
   FD_SET((unsigned int) socket, &sready);
   memset((char *) &nowait, 0, sizeof(nowait));

   bool res = select(socket + 1, &sready, NULL, NULL, &nowait);
   if(FD_ISSET(socket, &sready))
      res = true;
   else
      res = false;
   return res;
}
//------------------------------------------------------------------------

但是结果是在调用之后,我所有的应用程序都按我选择的使用非阻塞套接字的方式工作。我通常在Linux上使用它,并且可以正常工作。我在网上找到了一些有关select()的信息,在我看来,它也可以在Windows下使用。但是...出了什么问题。

任何帮助和建议将不胜感激。 谢谢, 马西莫

0 个答案:

没有答案