socket关闭后为什么recv不返回

作者&投稿:漫皆 (若有异议请与网页底部的电邮联系)
socket关闭后为什么recv不返回~

recv是socket编程中最常用的函数之一,在阻塞状态的recv有时候会返回不同的值,而对于错误值也有相应的错误码,分别对应不同的状态,下面是我针对常见的几种网络状态的简单总结。
首先阻塞接收的recv有时候会返回0,这仅在对端已经关闭TCP连接时才会发生。
而当拔掉设备网线的时候,recv并不会发生变化,仍然阻塞,如果在这个拔网线阶段,socket被关掉了,后果可能就是recv永久的阻塞了。
所以一般对于阻塞的socket都会用setsockopt来设置recv超时。
当超时时间到达后,recv会返回错误,也就是-1,而此时的错误码是EAGAIN或者EWOULDBLOCK,POSIX.1-2001上允许两个任意一个出现都行,所以建议在判断错误码上两个都写上。
如果socket是被对方用linger为0的形式关掉,也就是直接发RST的方式关闭的时候,recv也会返回错误,错误码是ENOENT
还有一种经常在代码中常见的错误码,那就是EINTER,意思是系统在接收的时候因为收到其他中断信号而被迫返回,不算socket故障,应该继续接收。但是这种情况非常难再现,我尝试过一边一直在不停的发信号,一边用recv接收数据,也没有出现过。这种异常错误我附近只有一个朋友在用write的时候见到过一次,但是总是会有概率出现的,所以作为完善的程序必须对此错误进行特殊处理。
一般设置超时的阻塞recv常用的方法都如下:
while(1)
{
cnt = (int)recv(m_socket, pBuf,RECVSIZE, 0);
if( cnt >0 )
{
//正常处理数据
}
else
{
if((cnt<0) &&(errno == EAGAIN||errno == EWOULDBLOCK||errno == EINTR)) //这几种错误码,认为连接是正常的,继续接收
{
continue;//继续接收数据
}
break;//跳出接收循环
}
}
阻塞与非阻塞recv返回值没有区分,都是 0 接收到数据大小。

Linux环境下,须如下定义:struct timeval timeout = {3,0};
//设置发送超时
setsockopt(socket,SOL_SOCKET,SO_SNDTIMEO,(char *)&timeout,sizeof(struct timeval));
//设置接收超时
setsockopt(socket,SOL_SOCKET,SO_RCVTIMEO,(char *)&timeout,sizeof(struct timeval));

一般来说意味着connection已经关闭,没有可读的数据了。

recv是socket编程中最常用的函数之一,在阻塞状态的recv有时候会返回不同的值,而对于错误值也有相应的错误码,分别对应不同的状态,下面是我针对常见的几种网络状态的简单总结。
首先阻塞接收的recv有时候会返回0,这仅在对端已经关闭TCP连接时才会发生。
而当拔掉设备网线的时候,recv并不会发生变化,仍然阻塞,如果在这个拔网线阶段,socket被关掉了,后果可能就是recv永久的阻塞了。
所以一般对于阻塞的socket都会用setsockopt来设置recv超时。
当超时时间到达后,recv会返回错误,也就是-1,而此时的错误码是EAGAIN或者EWOULDBLOCK,POSIX.1-2001上允许两个任意一个出现都行,所以建议在判断错误码上两个都写上。
如果socket是被对方用linger为0的形式关掉,也就是直接发RST的方式关闭的时候,recv也会返回错误,错误码是ENOENT
还有一种经常在代码中常见的错误码,那就是EINTER,意思是系统在接收的时候因为收到其他中断信号而被迫返回,不算socket故障,应该继续接收。但是这种情况非常难再现,我尝试过一边一直在不停的发信号,一边用recv接收数据,也没有出现过。这种异常错误我附近只有一个朋友在用write的时候见到过一次,但是总是会有概率出现的,所以作为完善的程序必须对此错误进行特殊处理。
一般设置超时的阻塞recv常用的方法都如下:
while(1)
{
cnt = (int)recv(m_socket, pBuf,RECVSIZE, 0);
if( cnt >0 )
{
//正常处理数据
}
else
{
if((cnt<0) &&(errno == EAGAIN||errno == EWOULDBLOCK||errno == EINTR)) //这几种错误码,认为连接是正常的,继续接收
{
continue;//继续接收数据
}
break;//跳出接收循环
}
}
阻塞与非阻塞recv返回值没有区分,都是 <0 出错 =0 连接关闭 >0 接收到数据大小。

Linux环境下,须如下定义:struct timeval timeout = {3,0};
//设置发送超时
setsockopt(socket,SOL_SOCKET,SO_SNDTIMEO,(char *)&timeout,sizeof(struct timeval));
//设置接收超时
setsockopt(socket,SOL_SOCKET,SO_RCVTIMEO,(char *)&timeout,sizeof(struct timeval));


VC socket 9903 被我close掉了,为什么下次再创建socket,分配的号还 ...
1.closesocket(一般不会立即关闭,并经历TIME_WAIT的过程)后想继续重用套接字:和BOOL bReuseaddr = TRUE;使用setsockopt(s,SOL_SOCKET,SO_REUSEADDR (为const char *)&bReuseaddr大小(BOOL));2。已经在强行关闭的连接状态SOKET的调用closesocket关闭没有经历过 TIME_WAIT:BOOL bDontLinger...

socket关闭之后 accept的fd还能通信吗
服务器端:是用于监听的套接字,accept函数执行之后,返回的值存与cli_clifd套接字中,跟客户端通信就是通过该套接字来进行。而你所定义的serv_servfd从这个程序上看,是用于监听用的,所以,send的第一个参数应该传cli_clifd!

如何才能正确的关闭Socket连接
连接重置后,本方send或recv会得到错误码10053(closesocket时是10038),对方recv会得到错误码10054,send则得到错误码10053(closesocket时是10054)。操作系统为我们提供了两个函数来关闭一个TCP连接,分别是closesocket和shutdown。通常情况下,closesocket会向对方发送一个FIN包,但是也有例外。比如有一个工作...

socket客户端关闭,服务端怎么处理
处理客户端断开连接后的工作 \/ \/ 将该客户端的输出流从共享集合中删除 \/ sendMessage(host+"下线了,当前在线:"+allOut+"人");System.out.println(host+"下线了");synchronized (allOut) { allOut.remove(pw);} if(socket!=null){ try { socket.close();} catch (IOException e) { e....

java程序,如何在客户端关闭后,服务器端把相应的连接客户端的线程终止...
try{ \/\/代码块 \/\/这里一般会用一个while(\/\/连接中){ \/\/判断接收的信息是退出的标志,是则按正常退出 \/\/否则,处理信息 \/\/继续读 } }catch(Exception e){ \/\/exception的类型最好写具体的子类 System.out.println("客户端连接中断..."+socket);}finally{ \/\/在这里关闭这个客户端的socket soc...

socket为什么无法绑定?
2.如果一个socket绑定了某个端口,该socket正常关闭或程序退出后,在一段时间内该端口依然保持被绑定的状态,其他程序(或者重新启动的原程序)无法绑定该端口。可以在获得socket描述符之后通过调用setsockopt语句避免该问题:int sockfd;int opt = 1;int len = sizeof(opt);sockfd = socket(AF_INET, ...

IOCP怎么正确关闭socket
如果服务端的Socket比客户端的Socket先关闭,会导致客户端出现TIME_WAIT状态,占用系统资源。所以,必须等客户端先关闭Socket后,服务器端再关闭Socket才能避免TIME_WAIT状态的出现。判断客户端Socket的关闭 最近试验发现,当客户端Socket关闭时,服务端的Socket会接收到0字节的通知。private int Receive(...

socket中shutdown和closesocket的区别
closesocket或shutdown(使用SD_SEND当作参数时),会向通信对方发出一个fin包,而此时套接字的状态会由ESTABLISHED变成FIN_WAIT_1,然后对方发送一个ACK包作为回应,套接字又变成FIN_WAIT_2,如果对方也关闭了连接则对方会发出FIN,我方会回应一个ACK并将套接字置为TIME_WAIT。因此可以看出closesocket,...

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

rt-threadsocket自动断开后占用的内存如何释放
不过,如果你在使用过程中发现内存仍然被占用,或者遇到内存泄漏等问题,可能是由于其他原因引起的,比如程序逻辑问题、代码错误或网络操作不当等。为了解决这种问题,你可以按照以下步骤进行排查和处理:1. 检查代码逻辑,确保在 socket 断开后正确的进行资源释放和清理工作,比如关闭 socket、释放相关的数据...

隆化县15174057942: socket关闭后为什么recv不返回 -
家迫百可: recv是socket编程中最常用的函数之一,在阻塞状态的recv有时候会返回不同的值,而对于错误值也有相应的错误码,分别对应不同的状态,下面是我针对常见的几种网络状态的简单总结. 首先阻塞接收的recv有时候会返回0,这仅在对端已经关...

隆化县15174057942: Socket关闭后,接收函数仍然阻塞,怎么让它返回 -
家迫百可: 在别处调用socket.Close后接收函数仍然阻塞,并不返回.服务端发来数据后,甚至仍然能够读出正确的数据,而之后才因为错误,说socket已经是null.

隆化县15174057942: 完成端口 为什么正常closesocket还是服务器还是会出现异常退出 -
家迫百可: 你好.和超时没关系,一般SOCKET在调用recv函数时如果有数据时才返回,如果没有数据时就在recv函数等待直至有数据或SOCKET关闭或网络异常,如果是SOCKET被关闭时,recv返回0,异常时返回-1,用GetLastError可以察看具体的错误.(只在socket为同步方式有效) 如果我的回答没能帮助您,请继续追问.

隆化县15174057942: socket中recv不是阻塞的么,没包为什么会通过 -
家迫百可:recv是socket编程中最常用的函数之一,在阻塞状态的recv有时候会返回不同的值,而对于错误值也有相应的错误码,分别对应不同的状态,下面是我针对常见的几种网络状态的简单总结.首先阻塞接收的recv有时候会返回0,这仅在...

隆化县15174057942: windows socket编程阻塞模式下,recv函数返回0? -
家迫百可: 在出错的时候recv会返回小于0.recv如果返回0,代表连接被对面关闭,而且是正常关闭的.

隆化县15174057942: 怎么判断SOCKET底层是否还有数据 -
家迫百可: 1. 根据ERRNO和recv结果进行判断 在UNIX/LINUX下,非阻塞模式SOCKET可以采用recv+MSG_PEEK的方式进行判断,其中MSG_PEEK保证了仅仅进行状态判断,而不影响数据接收 对于主动关闭的SOCKET, recv返回-1,而且errno被置为9...

隆化县15174057942: 如何才能正确的关闭Socket连接 -
家迫百可: 从TCP协议角度来看,一个已建立的TCP连接有两种关闭方式,一种是正常关闭,即四次挥手关闭连接;还有一种则是异常关闭,我们通常称之为连接重置(RESET). 首先说一下正常关闭时四次挥手的状态变迁,关闭连接的主动方状态变迁...

隆化县15174057942: vc网络编程中当客户端关闭socket时如何通知服务器端 -
家迫百可: 没懂什么叫“自动”当套接字关闭的时候,服务器端recv调用会返回0

隆化县15174057942: 服务器关闭socket后怎么还能通信 -
家迫百可: 服务器在调用recv函数之后应判断接收到的字节数,等于0表示对方已经断开!如果不及时断开,就会循环不断接收很多信息.

隆化县15174057942: python socket 阻塞模式怎么确保数据recv -
家迫百可: 可以通过setsockopt,或者更简单的setblocking, settimeout设置.阻塞式的socket的recv服从这样的规则: 当缓冲区内有数据时,立即返回所有的数据;当缓冲区内无数据时,阻塞直到缓冲区中有数据.非阻塞式的socket的recv服从的规则则是: 当缓冲区内有数据时,立即返回所有的数据;当缓冲区内无数据时,产生EAGAIN的错误并返回(在Python中会抛出一个异常).两种情况都不会返回空字符串,返回空数据的结果是对方关闭了连接之后才会出现的.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网