TCP的数据缓冲区

接收缓冲区
接收缓冲区的最初概念指的是套接字从网络接收到的数据对应的暂存区,尤其当传输的数据是结构化数据时,设定特定大小的缓冲区就特别有用。
image
接收缓冲区的大小属于Linux系统套接字文件的属性选项之一,所以想要设置接收缓冲区的大小,则需要通过设置套接字的属性选项实现,Linux系统中提供了两个函数接口来获取和设置套接字的属性选项,分别是getsockopt()和setsockopt(),使用规则如下所示:
image

1)函数参数
可以看到,setsockopt()函数和getsockopt()函数有5个参数,另外,关于套接字选项的描述,需要通过man手册的第7章了解,输入 man 7 socket即可
第一个参数:sockfd指的是创建的套接字对应的文件描述符,其实是socket()函数的返回值。
第二个参数:level指的是选项对应的协议级别,一般建议把该参数设置为SOL_SOCKET即可。
第三个参数:optname指的是选项的名称,比如设置接收缓冲区的宏是SO_RCVBUF
image
image
第四个参数:optval指的是要设置的选项值,比如要设置接收缓冲区,则设置为某个有效值。
第五个参数:optlen指的是选项值的长度,一般可以通过sizeof计算对应选项值的长度大小。
注意:如果打算设置TCP接收缓冲区大小,应该在调用listen()函数之前进行设置才会生效!!!

发送缓冲区
TCP的发送缓冲区用来为数据的丢失重发做准备,在Linux下TCP的发送缓冲区大小一般介于 4608-425984 之间,不同主机的检测结果可能有所不同。发送缓冲区的基本作用,是当接收方发现数据丢失要求发送方重发时,发送方有备份数据可以重新发送。

二、TCP的OOB带外数据
image
注意:OOB带外数据每次只能发送一个字节,但是可以发送多次,由于recv()函数和send()函数的第4个参数才可以指定MSG_OOB标志,所以紧急带外数据只能通过这两个函数进行收发。
注意:带外数据也是通过内核缓冲区发送出去,所以接收端接收到带外数据之后也需要从内核缓冲区中读取出来,但是由于带外数据属于紧急情况下为了防止阻塞和水位线的限制提供的一种数据发送模式,所以发送端每次发送带外数据时只能发送一个字节,并且接收端需要对SIGURG信号进行注册,但是由于信号触发之后会中断程序执行,应该确保信号响应接口只是完成接收动作,应该确保响应函数立即结束。

多路复用
多路复用指的是通过某个特定的接口来同时监听多路阻塞IO,这就达到既无需多进程多线程,又可以同时处理多个阻塞套接字的目的。
Linux系统中提供了两个函数select()或poll()实现同时监控多个套接字,当发现一个或多个套接字的某种状态就绪(读状态、写状态)时,再调用相应的函数去处理的过程。
image
image
image

点击查看代码
fd_set t_set1;
int sockfd = ...; // 假设是已创建的监听 socket

// 1. 初始化集合
FD_ZERO(&t_set1);  
FD_SET(sockfd, &t_set1);  

// 2. 调用 select,阻塞等待事件
//    第三个参数填 &t_set1 表示监听读事件,返回后集合会被内核修改,标记有事件的 fd
int activity = select(sockfd + 1, &t_set1, NULL, NULL, NULL);  

// 3. 检查 sockfd 是否有事件
if (FD_ISSET(sockfd, &t_set1)) {  
    // 说明 sockfd 有新连接/数据可读等事件,可 accept 或读数据  
}
posted @ 2025-08-20 17:54  Lè_Sage  阅读(77)  评论(0)    收藏  举报