网络编程close与shutdown的区别

33 篇文章 1 订阅
25 篇文章 2 订阅

 一、close与shutdown 的区别:
1、close终止了数据传送的两个方向; 这个函数会对套接字引用计数减一,一旦发现套接字引用计数到 0,就会对套接字进行彻底释放,并且会关闭 TCP 两个方向的数据流。
2、shutdown 可以有选择的终止某个方向的数据传送或者数据传送的两个方向、

二、shutdown 如果howto=1(SHUT_WR),就可以保证对等方接收到一个EOF字符,而不管其他进程是否已经打开了套接字(不管引用计数是否为1都激发TCP的正常终止连接)。shutdown直接使得该套接字不可用,如果有别的进程企图使用该套接字,将会受到影响。而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)     //子进程
{
    //通信
  //....       
  
    //子进程使用完conn,close(conn) 引用计数减为0,这时才会向双方发送FIN段。
    close(conn);
} else if(pid>0)   //父进程
{
    //父进程不会向客户端发送FIN.要考虑到引用计数。
    //close(conn) 父进程用不到conn,将conn引用计数减一 。 
    //shutdown(conn,SHUT_WR) 的话不理会引用计数,直接向对方发送FIN段
  close(conn);
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值