我编写了一个简短的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下使用。但是...出了什么问题。
任何帮助和建议将不胜感激。 谢谢, 马西莫