码迷,mamicode.com
首页 > 其他好文 > 详细

close()和shutdown()函数

时间:2016-05-16 21:43:48      阅读:128      评论:0      收藏:0      [点我收藏+]

标签:

一·close(int sockfd)

  当server和client建立连接,server调用close(),则server发送fin给client,server不在通过该套接字继续传送消息或者接收消息,此时client调用read,如果接收到fin则返回0,但是此时的client还是可以write给server,并且write只是将信息发送给缓冲区,当server收到该数据报会返回一个rst数据报连接重置,表示server不再接受消息,如果要传送消息,则需要连接重置。client接收到RST后并不会直接传送给应用层,只是将该状态保存在TCP协议层,当client再次调用write给server时,因为连接已经处于RST状态,则不再有数据发出,而是SIGPIPE一个信号给应用层.仅此计数为0时才关闭套接字,发送TCP的正常连接终止序列

  并且该函数并不是真正的四分组终止序列,而是将描述符的访问计数-1,

二·shutdown(int sockfd,int howto)

  1>close将描述符的访问计数-1,只有在此计数为0时关闭套接字。用shutdown激发TCP的正常连接终止序列,而不管访问计数。

  2>close终止了数据传送的两个方向:读和写。由于TCP连接数全双工的,有很多时候要通知另一端已完成了数据发送,即使另一端有很多数据要发送也是如此,shutdown函数可以仅仅关闭连接的读,写或两个方向都关闭

  howto:

  1.SHUT_RD 关闭连接的读一半,不再接受套接口的数据,而且留在套接口接收缓冲区中的数据都作废,进程不能再对套接口执行任何读进程。调用此函数后,TCP套接口接受的数据被接收,但数据本身被扔掉。

  2.SHUT_WD 关闭连接的写一半 此情况称为半关闭,当前留在套接口发送给缓冲区的数据都被发送,后跟正常的TCP终止序列,进程不能在执行对套接口的任何写函数。

  3.SHUT_RDWR 连接的读这一半和写这一半都关闭,等同于调用函数shutdown()两次,第一次调用时用SHUT_RD,第二次调用时用SHUT_WR。

 

  

close()和shutdown()函数

标签:

原文地址:http://www.cnblogs.com/chenyang920/p/5499232.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!