如何判断socket已经断开

如题所述

Socket在连接以后,如果客户端非正常退出,比如网线掉了、超时退出等,服务器端的socket仍然有缓存,此时可以从该socket描述符中读出一些数据,短时间内甚至可以写,因此判断TCP socket是否断开及其不易,网上有很多方法,都不能精确判断。本人用select()和recv写了一个,在缓冲区被读完以后判断非常管用。这里,recv时使用MSG_PEEK参数,数据不会从缓冲区中清除掉,因此不会影响正常的读写。
/* check whether socket is connected. Actually, it is not accurate if the client
* crashs and the server don't know about it because the socket buffer is ready.
* So the return value '0' doesn't mean the socket is really valid. Of course,
* '-1' shows the socket is invalid*/int checksock(int s){fd_set fds;
char buf[2];
int nbread;
FD_ZERO(&fds);
FD_SET(s,&fds);
if ( select()(s+1, &fds, (fd_set *)0, (fd_set *)0, NULL) == -1 ) {
//log(LOG_ERR,"select()(): %s\n",strerror(errno)) ;return -1;}if (!FD_ISSET(s,&fds)) {
//log(LOG_ERR,"select() returns OK but FD_ISSET not\n") ;return -1;}/* read one byte from socket */
温馨提示:内容为网友见解,仅供参考
无其他回答

如何判断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连接已与服务器断开
当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, &info,...

如何判断socket已经断开
3)如果select()函数返回的值为1,但是使用recv()函数读取的数据长度为0,那么说明该socket已经断开。如果recv()返回值小于等于0时,客户端的连接已经断开,但是还需要判断errno是否等于EINTR。如果errno=EINTR则说明recv()函数是由于程序接收到中断信号后返回的,socket连接应该还是正常,步应该close掉socket...

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

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

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

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

如何判断socket断开 getsockopt
(1)recv到数据时,会返回。(2)在整个程序接收到信号时,返回-1。errno = EINTR。\/\/在程序的起始阶段,屏蔽掉信号的除外。部分信号还是屏蔽不掉的。(3)socket出现问题时,返回-1.具体错误码看 man recv()(4)一定要看 man 说明,很详细,很有帮助。

相似回答
大家正在搜