网络编程中close与shutdown区别
2015-05-30 20:37
337 查看
关于sockt通信中关闭函数的使用及不同:
因为套接字通信可以理解为全双工的通信模式,如上图所示,客户端和服务端都可以发送和接收数据,及write和read操作。
当其中的一方调用close函数时,即释放该sockfd文件描述符所占用的资源,从而停止socket上的任何操作
close-----关闭本进程的socket id,但链接还是开着的,用这个socket id的其它进程(父进程关系的进程)还能用这个链接,能读或写这个socket id
shutdown--则破坏了socket 链接,读的时候可能侦探到EOF结束符,写的时候可能会收到一个SIGPIPE信号,这个信号可能直到socket buffer被填充了才收到
例如:(1)如果客户端关闭了套接字close,而服务器调用了一次write,服务器会接收到一个RST segment(TCP 传输层),如果此时服务器再次调用write,这个时候就会产生SIGPIPE信号。可采用忽略该信号方式来处理该信号避免系统因为该信号退出可采用:signal(SIGPIPE,SIG_IGN)
(2)如果服务器端主动断开连接(先与client调用close),服务器端会进入time_wait状态,所以在协议设计上,应该让客户端主动断开连接,这样就把time_wait状态分散到大量的客户端。
总结如下:
1、close终止了数据传送的的两个方向
2、shutdown可以有选择的终止某个方向的数据传送或者终止数据传送的两个方向
3、shutdown how=1就可以保证对等方接收到一个EOF字符,而不管其他进程是否已经打开了套接字。
而close不能保证,直到套接字引用计数减为0时才发送,也就是是说直到所有进程都关闭了套接字。
相关文章推荐
- Drill中实现HTTP storage plugin
- Linux软件包安装2——基于red hat系列的rpm命令安装及apache简单搭建httpserver
- xmu 1076: 安全网络 ver.3(最小生成树模型)
- xmu 1074: 安全网络 ver.1(MST模型)
- linux常用命令-简单网络通信命令
- TCP连接状态详解
- cocos2dx3.3 C++和Android的网络连接状态
- 【转载】C# HttpWebRequest 发送SOAP XML
- (转载)HttpWebRequest的GetResponse或GetRequestStream偶尔超时 + 总结各种超时死掉的可能和相应的解决办法
- C#中HttpWebRequest的GetRequestStream执行的效率太低,甚至偶尔死掉
- 在ATS 5.3.0上开启stats_over_http插件
- TCP/IP 笔记 1.1 概 述
- 网络开发总结
- 第十四篇 迷茫的星期六
- HTTP协议详解
- WCF : 如何将NetTcpBinding寄宿在IIS7上
- Android利用json进行网络解析
- 基于net.tcp的WCF配置实例解析
- 5个替代Apache和IIS的轻量级网络服务器
- java中的网络编程