如何判断一个SOCKET连接是否已经断开

如题所述

第1个回答  2016-07-15
1. 根据ERRNO和recv结果进行判断
在UNIX/LINUX下,非阻塞模式SOCKET可以采用recv+MSG_PEEK的方式进行判断,其中MSG_PEEK保证了仅仅进行状态判断,而不影响数据接收
对于主动关闭的SOCKET, recv返回-1,而且errno被置为9(#define EBADF 9 /* Bad file number */)或104 (#define ECONNRESET 104 /* Connection reset by peer */)
对于被动关闭的SOCKET,recv返回0,而且errno被置为11(#define EWOULDBLOCK EAGAIN /* Operation would block */)
对正常的SOCKET, 如果有接收数据,则返回>0, 否则返回-1,而且errno被置为11(#define EWOULDBLOCK EAGAIN /* Operation would block */)

因此对于简单的状态判断(不过多考虑异常情况):
recv返回>0, 正常
返回-1,而且errno被置为11 正常
其它情况 关闭本回答被提问者采纳

如何判断socket已经断开
的异常。因此,如果隔了一段时间没有使用某个Socket,需要重新使用它的时候,就要先判断它究竟是否还在连接当中,一共尝试了Socket的三个方法: 1、isClosed()2、isOutputShutdown() 3、isConnected() 发现前两个都没用,即使已经断开了,返回的还是false,只有第三个可以解决问题。 具体原因未知。

如何判断SOCKET已经断开
当使用 select()函数测试一个socket是否可读时,如果select()函数返回值为1,且使用recv()函数读取的数据长度为0 时,就说明该socket已经断开。经过代码试验,如果进程受到一些信号时,例如:EINTR,recv()返回值小于等于0时,这是就需要判断 errno是否等于 EINTR , 如果errno == EINTR 则说明recv函数是...

如何判断一个SOCKET连接是否已经断开
1. 根据ERRNO和recv结果进行判断 在UNIX\/LINUX下,非阻塞模式SOCKET可以采用recv+MSG_PEEK的方式进行判断,其中MSG_PEEK保证了仅仅进行状态判断,而不影响数据接收 对于主动关闭的SOCKET, recv返回-1,而且errno被置为9(#define EBADF 9 \/* Bad file number *\/)或104 (#define ECONNRESET 104 ...

怎样判定socket连接已经关闭
2)使用select()函数测试一个socket是否可读;3)如果select()函数返回的值为1,但是使用recv()函数读取的数据长度为0,那么说明该socket已经断开。4)如果recv()返回值小于等于0时,客户端的连接已经断开,但是还需要判断errno是否等于EINTR。如果errno=EINTR则说明recv()函数是由于程序接收到中断信号后返...

nodejssocket怎么检测客户端主动断开连接
我们只要client.poll(10,selectmode.selectread)判断就行了。只要返回true是。就可以认为客户端已经断开了。poll方法将会检查socket的状态。指定selectmode参数的selectmode..::.selectread,可确定socket是否为可读。指定selectmode..::.selectwrite,可确定socket是否为可写。使用selectmode..::.selecterror...

怎样实时判断socket链接状态
法一:当recv()返回值小于等于0时,socket连接断开。但是还需要判断 errno是否等于 EINTR,如果errno == EINTR 则说明recv函数是由于程序接收到信号后返回的,socket连接还是正常的,不应close掉socket连接。法二:struct tcp_info info;int len=sizeof(info);getsockopt(sock, IPPROTO_TCP, TCP_INFO, ...

服务器怎么判断客户端socket是否已断开连接
你可以根据服务器收到的数据的长度来判断,如果服务器收到的数据长度是0,那么意味着你的客户端程序已经断开了连接。从TCP\/IP协议栈的角度来说,就是客户端程序关闭了自己写的这一半连接,向服务器发出了一个FIN。这涉及到TCP的状态迁移,关于这方面的知识,建议你看一下Richard Stevens先生的《TCP\/IP...

java socket 判断是否断开了
首先想到socket类的方法isClosed()、isConnected()、isInputStreamShutdown()、isOutputStreamShutdown()等,但经过试验并查看相关文档,这些方法都是本地端的状态,无法判断远端是否已经断开连接。然后想到是否可以通过OutputStream发送一段测试数据,如果发送失败就表示远端已经断开连接,类似ping,但是这样会...

如何判断socket已经断开
Socket在连接以后,如果客户端非正常退出,比如网线掉了、超时退出等,服务器端的socket仍然有缓存,此时可以从该socket描述符中读出一些数据,短时间内甚至可以写,因此判断TCP socket是否断开及其不易,网上有很多方法,都不能精确判断。本人用select()和recv写了一个,在缓冲区被读完以后判断非常管用。这...

socket 怎么检测连接是否断开?
Windows下通过WSASend、WSARecv函数的返回值和错误代码判断,而者缺一不可!iRet = WSARecv(pClient->m_Socket, &(pBuffer->m_WsaBuffer), 1, &lIoSize, &lFlags, &(pBuffer->m_Olp), NULL);if(SOCKET_ERROR == iRet && ERROR_IO_PENDING != WSAGetLastError()){ TRACE("ServerIoThread ...

相似回答