linux socket 缓存查看,linux下查看系统socket读写缓冲区

本文详细介绍了在Linux系统中如何查看和设置Socket的读写缓冲区大小,包括TCP和UDP的默认、最大及最小缓冲区配置,并通过示例展示了如何使用setsockopt函数调整这些值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一:linux下查看系统socket读写缓冲区大小配置:

http://blog.youkuaiyun.com/herecles/article/details/8146017

1. tcp 收发缓冲区默认值

[root@ www.linuxidc.com]# cat /proc/sys/net/ipv4/tcp_rmem

4096    87380   4161536

87380  :tcp接收缓冲区的默认值

[root@ www.linuxidc.com]# cat /proc/sys/net/ipv4/tcp_wmem

4096    16384   4161536

16384  : tcp 发送缓冲区的默认值

2. tcp 或udp收发缓冲区最大值

[root@ www.linuxidc.com]# cat /proc/sys/net/core/rmem_max

131071

131071:tcp 或 udp 接收缓冲区最大可设置值的一半。

也就是说调用 setsockopt(s, SOL_SOCKET, SO_RCVBUF, &rcv_size, &optlen);  时rcv_size 如果超过 131071,那么

getsockopt(s, SOL_SOCKET, SO_RCVBUF, &rcv_size, &optlen); 去到的值就等于 131071 * 2 = 262142

[root@ www.linuxidc.com]# cat /proc/sys/net/core/wmem_max

131071

131071:tcp 或 udp 发送缓冲区最大可设置值得一半。

跟上面同一个道理

3. udp收发缓冲区默认值

[root@ www.linuxidc.com]# cat /proc/sys/net/core/rmem_default

111616:udp接收缓冲区的默认值

[root@ www.linuxidc.com]# cat /proc/sys/net/core/wmem_default

111616

111616:udp发送缓冲区的默认值

4. tcp 或udp收发缓冲区最小值

tcp 或udp接收缓冲区的最小值为 256 bytes,由内核的宏决定;

tcp 或udp发送缓冲区的最小值为 2048 bytes,由内核的宏决定

二:socket编程设置读写缓冲区大小:

http://blog.youkuaiyun.com/maopig/article/details/6982457

系统提供的socket缓冲区大小为8K,你可以将之设置为64K,尤其在传输实时视频时。

socket发送数据时候先把数据发送到socket缓冲区中,之后接受函数再从缓冲区中取数据,如果发送端特别快的时候,缓冲区很快就被填满(socket默认的是1024×8=8192字节),这时候我们应该根据情况设置缓冲区的大小,可以通过setsockopt函数实现

#include

#include

#include

#include

#include

#include

#include

#include

int main(int argc,char **argv)

{

int err = -1;        /* 返回值 */

int s = -1;            /* socket描述符 */

int snd_size = 0;   /* 发送缓冲区大小 */

int rcv_size = 0;    /* 接收缓冲区大小 */

socklen_t optlen;    /* 选项值长度 */

/*

* 建立一个TCP套接字

*/

s = socket(PF_INET,SOCK_STREAM,0);

if( s == -1){

printf("建立套接字错误\n");

return -1;

}

/*

* 先读取缓冲区设置的情况

* 获得原始发送缓冲区大小

*/

optlen = sizeof(snd_size);

err = getsockopt(s, SOL_SOCKET, SO_SNDBUF,&snd_size, &optlen);

if(err<0){

printf("获取发送缓冲区大小错误\n");

}

/*

* 打印原始缓冲区设置情况

*/

/*

* 获得原始接收缓冲区大小

*/

optlen = sizeof(rcv_size);

err = getsockopt(s, SOL_SOCKET, SO_RCVBUF, &rcv_size, &optlen);

if(err<0){

printf("获取接收缓冲区大小错误\n");

}

printf(" 发送缓冲区原始大小为: %d 字节\n",snd_size);

printf(" 接收缓冲区原始大小为: %d 字节\n",rcv_size);

/*

* 设置发送缓冲区大小

*/

snd_size = 10*1024;    /* 发送缓冲区大小为8K */

optlen = sizeof(snd_size);

err = setsockopt(s, SOL_SOCKET, SO_SNDBUF, &snd_size, optlen);

if(err<0){

printf("设置发送缓冲区大小错误\n");

}

/*

* 设置接收缓冲区大小

*/

rcv_size = 10*1024;    /* 接收缓冲区大小为8K */

optlen = sizeof(rcv_size);

err = setsockopt(s,SOL_SOCKET,SO_RCVBUF, (char *)&rcv_size, optlen);

if(err<0){

printf("设置接收缓冲区大小错误\n");

}

/*

* 检查上述缓冲区设置的情况

* 获得修改后发送缓冲区大小

*/

optlen = sizeof(snd_size);

err = getsockopt(s, SOL_SOCKET, SO_SNDBUF,&snd_size, &optlen);

if(err<0){

printf("获取发送缓冲区大小错误\n");

}

/*

* 获得修改后接收缓冲区大小

*/

optlen = sizeof(rcv_size);

err = getsockopt(s, SOL_SOCKET, SO_RCVBUF,(char *)&rcv_size, &optlen);

if(err<0){

printf("获取接收缓冲区大小错误\n");

}

/*

* 打印结果

*/

printf(" 发送缓冲区大小为: %d 字节\n",snd_size);

printf(" 接收缓冲区大小为: %d 字节\n",rcv_size);

close(s);

return 0;

}

运行后的结果:

发送缓冲区原始大小为: 16384 字节

接收缓冲区原始大小为: 87380 字节

发送缓冲区大小为: 20480 字节

接收缓冲区大小为: 20480 字节

从结果 看出ubuntu系统默认的发送缓冲区大小:16384字节,接收缓冲区87380字节

但是有个问题我设置的接收和发送缓冲区大小为:10*1024=10240字节,但是实际用getoptsock得到却是20480字节加了一倍。改成其他大小也是都是加倍。

这是由linux内核的算法决定的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值