设置读缓存大小
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,由内核的宏决定欢迎分享,转载请注明来源:内存溢出
评论列表(0条)