网络编程中close与shutdown区别

网络编程中close与shutdown区别_第1张图片

关于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时才发送,也就是是说直到所有进程都关闭了套接字。

你可能感兴趣的:(Linux网络编程)