Winsock recv() 不阻塞
我刚刚编译了这段代码: http://www.win32developer.com/tutorial/winsock/winsock_tutorial_2.shtm
我添加了一些代码,以便它在无限循环中执行recv()。我的问题是,如果没有数据读取,它仍然不会阻塞。
如果我认为 recv 应该在我的情况下阻塞,我是完全错误的吗?
我添加的代码是:
for(;;)
{
char buffer[1000];
memset(buffer,0,999);
int inDataLength = recv(Socket,buffer,1000,0);
int nError=WSAGetLastError();
if(nError!=WSAEWOULDBLOCK&&nError!=0)
{
std::cout<<"Winsock error code: "<<nError<<"\r\n";
std::cout<<"Client disconnected!\r\n";
// Shutdown our socket
shutdown(Socket,SD_SEND);
// Close our socket entirely
closesocket(Socket);
break;
}
}
它位于末尾,在 std::cout<<"Client returned!\r\n\r\n";
行之后。 我知道我从“非阻塞”示例中复制了此代码,但我认为这段代码不应该真正执行任何非阻塞操作,但我的 for 循环仍然疯狂运行!
I have just compiled this code:
http://www.win32developer.com/tutorial/winsock/winsock_tutorial_2.shtm
I have added some codes so it does recv(), in an infinite loop. My problem, if there is no data to read, it still does not block.
Am I totally mistaken if I think recv should block in my case?
The code I have added is:
for(;;)
{
char buffer[1000];
memset(buffer,0,999);
int inDataLength = recv(Socket,buffer,1000,0);
int nError=WSAGetLastError();
if(nError!=WSAEWOULDBLOCK&&nError!=0)
{
std::cout<<"Winsock error code: "<<nError<<"\r\n";
std::cout<<"Client disconnected!\r\n";
// Shutdown our socket
shutdown(Socket,SD_SEND);
// Close our socket entirely
closesocket(Socket);
break;
}
}
It is at the end, after the std::cout<<"Client connected!\r\n\r\n";
line.
I know I copied this from a "non blocking" example, but I dont think this code should do anything nonblocking really, still, my for loop is running like mad!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
![扫码二维码加入Web技术交流群](/public/img/jiaqun_03.jpg)
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
recv
默认情况下应该是阻塞的,除非出现套接字错误或者您显式地将套接字设置为非阻塞。请务必检查返回值是否有错误。有关详细信息,请参阅有关 recv。recv
should block by default, unless there's a socket error or you explicitly set the socket to non-blocking. Be sure to check the return value for error. For more information see the Microsofts MSDN article on recv.循环未正确检查错误。它需要更像这样:
The loop is not checking for errors correctly. It needs to be more like this instead:
这就是它应该看起来的样子,而不是你是如何做到的。
That's how it should look, and not how you did it.