社区
Linux/Unix社区
帖子详情
socket关闭后为什么recv不返回
edifier
2010-11-07 01:18:48
程序中实现客户端和服务器端功能,socket均使用阻塞方式接收和发送。客户端主动关闭本次socket,recv立即从阻塞方式返回。而在服务器端,socket由accept获得,参数均设置成和客户端socket一样,程序运行时,服务器端自动关闭socket,程序仍阻塞在recv函数中,请各位大拿帮忙分析一下是什么问题,同样的程序在win32下正常。
...全文
1889
14
打赏
收藏
socket关闭后为什么recv不返回
程序中实现客户端和服务器端功能,socket均使用阻塞方式接收和发送。客户端主动关闭本次socket,recv立即从阻塞方式返回。而在服务器端,socket由accept获得,参数均设置成和客户端socket一样,程序运行时,服务器端自动关闭socket,程序仍阻塞在recv函数中,请各位大拿帮忙分析一下是什么问题,同样的程序在win32下正常。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
14 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
edifier
2010-11-14
打赏
举报
回复
6楼正解,服务器端主动断开与客户端连接时,先shutdown,再close,服务器端代码可以很快从recv阻塞中返回。3ks。
lazy_2010
2010-11-12
打赏
举报
回复
在 recv 之前,没有调用 select 函数?
gettext
2010-11-11
打赏
举报
回复
tcp socket关闭是单向的, client recv出错后需要close socket.
edifier
2010-11-11
打赏
举报
回复
大家的理解有偏差,是我没说清楚。代码是公共代码,既可以用于服务器,也可以用于客户端。
当作为客户端运行时,不管是对侧(服务器端)发起关闭,还是本侧(客户端)主动关闭与服务器的连接,客户端程序均能很快从recv阻塞状态中返回。
当作为服务器运行时,对侧(客户端)发起关闭,服务器应用程序可以很快从recv阻塞状态返回,但服务器主动关闭与客户端的连接时则服务器程序一直阻塞在recv函数中。
hawk198
2010-11-11
打赏
举报
回复
[Quote=引用 10 楼 gettext 的回复:]
tcp socket关闭是单向的, client recv出错后需要close socket.
[/Quote]
就是这个情况,如果服务器close了,客户端的阻塞就结束了,收到0,表示是对端关闭,这时候客户端需要处理的
justkk
2010-11-09
打赏
举报
回复
[Quote=引用 5 楼 edifier 的回复:]
可能没写清楚:当作为客户端运行时,不管是对侧(服务器端),还是本侧主动关闭,客户端程序均能很快从recv阻塞状态中返回。
当作为服务器运行时,对侧(客户端)关闭,服务器应用程序可以很快从recv阻塞状态返回,但服务器主动关闭该连接时则服务器程序一直阻塞在recv函数中。
[/Quote]
还是没听明白..
客户端运行时,本侧关闭??客户端关闭自己的描述符?
谭海燕
2010-11-09
打赏
举报
回复
server主动close掉connect,server会通知client,client会做出应答,
然后client会发起close。
参考这个帖子,跟你差不多的问题
http://topic.csdn.net/u/20100914/19/6ff94f36-9ef7-420f-9764-613e53c2c0f3.html?88453
yangzhifu
2010-11-09
打赏
举报
回复
遇到过这样的问题,客户端断开后服务端可以很好的检测,但是相反服务端断开后客户端一只阻塞读,其原因在于你在服务端调用的是close,而不是shutdown函数;因为close只有在最后一个获得引用被关闭时菜释放网络端点,如果你的服务端套接字被复制了(dup),那么它将不会被关闭;相反shutdown函数可以使一个套接字处于不活动状态,无论它的引用文件描述符是多少;所以建议你在服务器端采用shutdown函数。
这些东西在《unix环境高级编程》439页有详细讲述。
wbruce
2010-11-09
打赏
举报
回复
感觉逻辑有问题,recv的返回应该是有对方close描述符发起的吧,所谓的四次挥手先由对方发起,本端recv返回0
edifier
2010-11-07
打赏
举报
回复
可能没写清楚:当作为客户端运行时,不管是对侧(服务器端),还是本侧主动关闭,客户端程序均能很快从recv阻塞状态中返回。
当作为服务器运行时,对侧(客户端)关闭,服务器应用程序可以很快从recv阻塞状态返回,但服务器主动关闭该连接时则服务器程序一直阻塞在recv函数中。
edifier
2010-11-07
打赏
举报
回复
代码较多,无法贴出,socket设置了以下属性:
SO_LINGER:启用
SO_RCVTIMEO:0s,无延时
TCP_NODELAY:启用
SO_SNDTIMEO:2s
SO_KEEPALIVE:打开
唯一的区别,客户端的socket是由socket()建立的,服务器端的socket是由accept()返回的。正常通信之后,需要主动断开时,close()本侧的socket,客户端可以从recv()阻塞中立即返回,而服务器端主动关闭时则程序一直阻塞在recv函数中。该部分代码在win32、vxworks下均正常。
Xjbala
2010-11-07
打赏
举报
回复
[Quote=引用 1 楼 weifirst118 的回复:]
贴代码上来
[/Quote]
up!
weifirst118
2010-11-07
打赏
举报
回复
贴代码上来
mymtom
2010-11-07
打赏
举报
回复
对方关闭了主动关闭时, recv/read都会返回0啊。
linux
socket
阻塞
recv
怎么
返回
如果
socket
是被对方用linger为0的形式关掉,也就是直接发RST的方式
关闭
的时候,
recv
也会
返回
错误,错误码是ENOENT还有一种经常在代码中常见的错误码,那就是EINTER,意思是系统在接收的时候因为收到其他中断信号而被迫
返回
,不算
socket
故障,应该继续接收。
recv
是
socket
编程中最常用的函数之一,在阻塞状态的
recv
有时候会
返回
不同的值,而对于错误值也有相应的错误码,分别对应不同的状态,下面是我针对常见的几种网络状态的简单总结。
socket
recv
()函数
返回
0的一种情况
假设使用
Socket
基于TCP通信协议进行C/S通信编程,客服端已经成功与服务端建立tcp连接,并且可以正常进行收发数据。 当一段时间后,服务端的程序如果调用close
socket
(sClient);WSACleanup();函数
关闭
socket
, 那么客户端的
recv
()将会
返回
0; 如果服务端没有调用close
socket
(sClient);而只调用WSACleanup()
linux下close 掉
socket
之后 阻塞的
recv
不会立即
返回
在开发的一个基于rtmp聊天的程序时发现了一个很奇怪的现象。 在windows下当我们执行 close
socket
的操作之后,阻塞的
recv
会立即
返回
-1 。 而在linux 下 当我们执行 close 操作之后 阻塞的
recv
会出现不能立即
返回
的现象。后来在网上一搜发现很多遇到类似这种现象的情况,大致意思应该是 当
socket
被动被close 的时候 进入了 “CLOSE_WA
socket
,
recv
函数
返回
值说明
socket
,
recv
函数
返回
值说明: 默认
socket
是阻塞的 解阻塞与非阻塞
recv
返回
值没有区分, 都是
返回
值: ret < 0 出错 ret = 0 连接
关闭
ret > 0 接收到数据大小 如果
recv
函数在等待协议接收数据时网络中断了,那么它
返回
0。 另一端已
关闭
则
返回
0。 ...
【
Socket
网络编程】17.
recv
() 函数详解
recv
函数 int
recv
(
SOCKET
s, char *buf, int len, int flags); 参数说明 第一个参数指定接收端套接字描述符; 第二个参数指明一个缓冲区,该缓冲区用来存放
recv
函数接收到的数据; 第三个参数指明buf的长度;第四个参数一般置0。 同步
Socket
的
recv
函数的执行流程 当应用程序调用
recv
函数时:
recv
先等待 SOCKE...
Linux/Unix社区
23,215
社区成员
74,537
社区内容
发帖
与我相关
我的任务
Linux/Unix社区
Linux/Unix社区 应用程序开发区
复制链接
扫一扫
分享
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章