close与shutdown

Posted wsw-seu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了close与shutdown相关的知识,希望对你有一定的参考价值。

  首先看一个例子,如下图所示:

技术图片

当我们客户端发送ABCD再close套接字的时候,服务器端的接收通道也被关闭了,将无法接收ABCD的数据。如果想要仅仅关闭发送通道,保留接收通道,可以使用shutdown。

 

 一、close与shutdown 的区别:
  1、close终止了数据传送的两个方向
  2、shutdown 可以有选择的终止某个方向的数据传送或者数据传送的两个方向、

二、shutdown 如果howto=1(SHUT_WR),就可以保证对等方接收到一个EOF字符,而不管其他进程是否已经打开了套接字(不管引用计数是否为1都激发TCP的正常终止连接)。而close不能保证(详见下面三中的例子,conn引用计数减为0才关闭),直到套接字引用计数减
位0时才发送。也就是说直到所有的进程都关闭了套接字。

 

三、
  int shutdown(int sockfd,int howto)
    howto=SHUT_RD (0)关闭连接的读的一半,不再接收数据
    howto=SHUT_WR (1)关闭连接的写的一半,
    howto=SHUT_RDWR(2)
例子:
int conn;
pid_t pid=fork();
if(pid==-1)
ERR_EXIT("fork");
if(pid==0)     //子进程

   close(sock);

  ....       //通信
  close(conn);//子进程使用完conn,close conn 引用计数减为0,这时才会向双方发送FIN段。
else if(pid>0)   //父进程

  close(conn);//父进程不会向客户端发送FIN.要考虑到引用计数。close(conn) 父进程用不到conn,将conn引用计数减一 。 shutdown(conn,SHUT_WR) 的话不理会引用计数,直接向对方发送FIN段

 

以上是关于close与shutdown的主要内容,如果未能解决你的问题,请参考以下文章

Linux命令之shutdown

linux重启的命令

基本常用命令

close与shutdown

Linux关机命令

close与shutdown