当前位置: 技术问答>linux和unix
socket关闭后为什么recv不返回
来源: 互联网 发布时间:2016-10-16
本文导语: 程序中实现客户端和服务器端功能,socket均使用阻塞方式接收和发送。客户端主动关闭本次socket,recv立即从阻塞方式返回。而在服务器端,socket由accept获得,参数均设置成和客户端socket一样,程序运行时,服务器端...
程序中实现客户端和服务器端功能,socket均使用阻塞方式接收和发送。客户端主动关闭本次socket,recv立即从阻塞方式返回。而在服务器端,socket由accept获得,参数均设置成和客户端socket一样,程序运行时,服务器端自动关闭socket,程序仍阻塞在recv函数中,请各位大拿帮忙分析一下是什么问题,同样的程序在win32下正常。
|
遇到过这样的问题,客户端断开后服务端可以很好的检测,但是相反服务端断开后客户端一只阻塞读,其原因在于你在服务端调用的是close,而不是shutdown函数;因为close只有在最后一个获得引用被关闭时菜释放网络端点,如果你的服务端套接字被复制了(dup),那么它将不会被关闭;相反shutdown函数可以使一个套接字处于不活动状态,无论它的引用文件描述符是多少;所以建议你在服务器端采用shutdown函数。
这些东西在《unix环境高级编程》439页有详细讲述。
这些东西在《unix环境高级编程》439页有详细讲述。
|
server主动close掉connect,server会通知client,client会做出应答,
然后client会发起close。
参考这个帖子,跟你差不多的问题
http://topic.csdn.net/u/20100914/19/6ff94f36-9ef7-420f-9764-613e53c2c0f3.html?88453
然后client会发起close。
参考这个帖子,跟你差不多的问题
http://topic.csdn.net/u/20100914/19/6ff94f36-9ef7-420f-9764-613e53c2c0f3.html?88453