linux下socket接收缓冲区有多大?如何查看和修改,望高手赐教

linux下socket接收缓冲区有多大?如何查看和修改,望高手赐教,第1张

int buflen = 65536*10

设置读缓存大小

if(0!=setsockopt(m_sendUdpSock,SOL_SOCKET,SO_RCVBUF,&buflen,4))

{

return OS_ERROR

}

设置写缓存大小

if(0!=setsockopt(m_sendUdpSock,SOL_SOCKET,SO_SNDBUF,&buflen,4))

{

return OS_ERROR

}

socklen_t getnumlen=4

读取写缓存大小

if(0!=getsockopt(g_sendUdpSock,SOL_SOCKET,SO_RCVBUF,&buflen,&getnumlen))

{

printf("\n%s\n",strerror(errno))

return OS_ERROR

}

进行socket编程有时候可能需要修改下socket的接收缓冲区大小,这里可以使用 setsockopt 函数,但是如果需要修改的缓冲区很大(比如500MB),则还需要修改系统内核的TCP/IP参数,不然接收缓冲区大小会收到内核参数的限制,所以需要改两个地方。下面以把socket接收缓冲区修改为500MB说明一下要作的修改。《Linux就该这么学》

修改内核TCP/IP参数

在终端用sysctl命令修改socket最大缓冲区限制:

sudo sysctl -w net.core.rmem_max=5242880001

在代码中用setsockopt函数修改SO_RCVBUF选项

int recvbuff = 500*1024*1024

if(setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, (const char*)&recvbuff, sizeof(int)) == -1)

printf("setsocket error\n")

else

printf("setsocket success\n")12345

以上两点,只改第1点,一个socket只会预留63个报文的接收缓冲;只改第2点,缓冲区大小会受到rmem_max的限制,如果需要的缓冲区很大的话,必须两点都改。

1. tcp 收发缓冲区默认值[root@ ]# cat /proc/sys/net/ipv4/tcp_rmem 409687380 416153687380 :tcp接收缓冲区的默认值[root@ ]# cat /proc/sys/net/ipv4/tcp_wmem409616384 416153616384 : tcp 发送缓冲区的默认值2. tcp 或udp收发缓冲区最大值[root@ ]# cat /proc/sys/net/core/rmem_max131071131071: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@ ]# cat /proc/sys/net/core/wmem_max 131071131071:tcp 或 udp 发送缓冲区最大可设置值得一半。跟上面同一个道理3. udp收发缓冲区默认值[root@ ]# cat /proc/sys/net/core/rmem_default 111616:udp接收缓冲区的默认值[root@ ]# cat /proc/sys/net/core/wmem_default111616111616:udp发送缓冲区的默认值4. tcp 或udp收发缓冲区最小值tcp 或udp接收缓冲区的最小值为 256 bytes,由内核的宏决定;tcp 或udp发送缓冲区的最小值为 2048 bytes,由内核的宏决定


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8657836.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-19
下一篇 2023-04-19

发表评论

登录后才能评论

评论列表(0条)

保存