4.24、半关闭、端口复用

文章介绍了TCP连接中的半关闭状态,即当一方发送FIN请求后,仍可接收数据但不可再发送。同时阐述了端口复用的概念,用于防止服务器重启时端口未释放的问题。设置套接字选项SO_REUSEADDR和SO_REUSEPORT可用于端口复用,并提到了netstat命令用于查看网络状态。
摘要由CSDN通过智能技术生成

UNIX网络编程卷1:套接字联网API(第3版) 等文件(提取码:q99x)

4.24、半关闭、端口复用

1.半关闭

TCP 链接中 A B 发送 FIN 请求关闭,另一端 B 回应 ACK 之后(A 端进入 FIN_WAIT_2 状态),并没有立即发送 FINAA 方处于半连接状态(半开关),此时 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) 将不会影响到其它进程。

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协议
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值