day11 soket编程之半关闭

来源:互联网 发布:大秦帝国 纵横 知乎 编辑:程序博客网 时间:2024/06/08 09:33

  当TCP链接中A发送FIN请求关闭,B端回应ACK后(A端进入FIN_WAIT_2状态),B没有立即发送FIN给A时,A方处在半链接状态,此时A可以接收B发送的数据,但是A已不能再向B发送数据。
  从程序的角度,可以使用API来控制实现半连接状态。
  

#include <sys/socket.h>int shutdown(int sockfd, int how);sockfd: 需要关闭的socket的描述符how:    允许为shutdown操作选择以下几种方式:    SHUT_RD(0): 关闭sockfd上的读功能,此选项将不允许sockfd进行读操作。                    该套接字不再接受数据,任何当前在套接字接受缓冲区的数据将被无声的丢弃掉。    SHUT_WR(1):     关闭sockfd的写功能,此选项将不允许sockfd进行写操作。进程不能在对此套接字发出写操作。    SHUT_RDWR(2):   关闭sockfd的读写功能。相当于调用shutdown两次:首先是以SHUT_RD,然后以SHUT_WR。

  使用close中止一个连接,但它只是减少描述符的引用计数,并不直接关闭连接,只有当描述符的引用计数为0时才关闭连接。shutdown不考虑描述符的引用计数,直接关闭描述符。也可选择中止一个方向的连接,只中止读或只中止写。
注意:

  1. 如果有多个进程共享一个套接字,close每被调用一次,计数减1,直到计数为0时,也就是所用进程都调用了close,套接字将被释放。
  2. 在多进程中如果一个进程调用了shutdown(sfd, SHUT_RDWR)后,其它的进程将无法进行通信。但,如果一个进程close(sfd)将不会影响到其它进程。
原创粉丝点击