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!
The loop is not checking for errors correctly. It needs to be more like this instead:
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.That's how it should look, and not how you did it.