如何在C++中通过Winsock检查客户端是否已断开连接?
如果您以阻塞模式调用recv,并返回0个字节读取,则套接字已断开连接,否则它会等待接收到字节。
请参阅FAQ 2.12
此页面上的select示例。
int nRet;
if(( nRet = select( 0, &fdread, NULL, NULL, NULL )) == SOCKET_ERROR )
{
// Error condition
// Check WSAGetLastError
}
if( nRet > 0 )
{
// select() will return value 1 because i m using only one socket
// At this point, it should be checked whether the
// socket is part of a set.
if( FD_ISSET( s, &fdread ))
{
// A read event has occurred on socket s
}
}
有几种不同的方法,但最常见的是检查发送或接收命令的结果:
nReadBytes = recv(sd, ReadBuffer, BufferSize, 0);
if (nReadBytes == SOCKET_ERROR)
{
//error
}
nSendBytes = send(sd, WriteBuffer, BufferSize, 0);
if (nSendBytes == SOCKET_ERROR)
{
//error
}
这里有更多的示例(包括客户端和服务器的错误检查):
WSAECONNRESET
对等方重置连接。
现有的连接被远程主机强制关闭。这通常是由于远程主机上的对等应用程序突然停止、主机重新启动、主机或远程网络接口禁用或远程主机使用硬关闭(有关SO_LINGER选项的更多信息,请参见setsockopt)而导致的。如果一个或多个操作正在进行中,那么此错误也可能是由于保持活动检测到失败而导致连接中断。正在进行的操作将以WSAENETRESET失败。随后的操作将以WSAECONNRESET失败。
非阻塞套接字也适用。
int r = recv(sock, NULL, 0, 0);
if(r == SOCKET_ERROR && WSAGetLastError() == WSAECONNRESET){
//client has disconnected!
}