UNIX网络编程卷1:套接字联网API(第3版) 等文件(提取码:q99x)
4.24、半关闭、端口复用
- 1.半关闭
- 2.端口复用
1.半关闭
当
TCP
链接中A
向B
发送FIN
请求关闭,另一端B
回应ACK
之后(A
端进入FIN_WAIT_2
状态),并没有立即发送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
不考虑描述符的引用计数,直接关闭描述符。也可选择中止一个方向的连接,只中止读或只中止写。
- 注意:
- 如果有多个进程共享一个套接字,
close
每被调用一次,计数减 1
,直到计数为0
时,也就是所用进程都调用了close
,套接字将被释放。 - 在多进程中如果一个进程调用了
shutdown(sfd, SHUT_RDWR)
后,其它的进程将无法进行通信。但如果一个进程close(sfd)
将不会影响到其它进程。
- 如果有多个进程共享一个套接字,
2.端口复用
端口复用最常用的用途是:
- 防止服务器重启时之前绑定的端口还未释放
- 程序突然退出而系统没有释放端口
#include <sys/types.h>
#include <sys/socket.h>
// 设置套接字的属性(不仅仅能设置端口复用)
int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen);参数:- sockfd : 要操作的文件描述符- level : 级别 - SOL_SOCKET (端口复用的级别)- optname : 选项的名称- SO_REUSEADDR- SO_REUSEPORT- optval : 端口复用的值(整形)- 1 : 可以复用- 0 : 不可以复用- optlen : optval参数的大小端口复用,设置的时机是在服务器绑定端口之前。
setsockopt();
bind();
- 常看网络相关信息的命令
netstat
参数:-a
所有的socket
-p
显示正在使用socket
的程序的名称-n
直接使用IP
地址,而不通过域名服务器-l
正在进行监听-t
使用TCP
协议-u
使用UDP
协议