linux下查看系统socket读写缓冲区
一:linux下查看系統(tǒng)socket讀寫緩沖區(qū)大小配置:
http://blog.csdn.net/herecles/article/details/8146017
?
1. tcp 收發(fā)緩沖區(qū)默認(rèn)值
[root@ www.linuxidc.com]# cat /proc/sys/net/ipv4/tcp_rmem ?
4096 ? ?87380 ? 4161536
87380 ?:tcp接收緩沖區(qū)的默認(rèn)值
[root@ www.linuxidc.com]# cat /proc/sys/net/ipv4/tcp_wmem?
4096 ? ?16384 ? 4161536
16384 ?: tcp 發(fā)送緩沖區(qū)的默認(rèn)值
2. tcp 或udp收發(fā)緩沖區(qū)最大值
[root@ www.linuxidc.com]# cat /proc/sys/net/core/rmem_max?
131071
131071:tcp 或 udp 接收緩沖區(qū)最大可設(shè)置值的一半。
也就是說調(diào)用 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 發(fā)送緩沖區(qū)最大可設(shè)置值得一半。
跟上面同一個道理
3. udp收發(fā)緩沖區(qū)默認(rèn)值
[root@ www.linuxidc.com]# cat /proc/sys/net/core/rmem_default ??
111616:udp接收緩沖區(qū)的默認(rèn)值
[root@ www.linuxidc.com]# cat /proc/sys/net/core/wmem_default?
111616
111616:udp發(fā)送緩沖區(qū)的默認(rèn)值
4. tcp 或udp收發(fā)緩沖區(qū)最小值
tcp 或udp接收緩沖區(qū)的最小值為 256 bytes,由內(nèi)核的宏決定;
tcp 或udp發(fā)送緩沖區(qū)的最小值為 2048 bytes,由內(nèi)核的宏決定
?
二:socket編程設(shè)置讀寫緩沖區(qū)大小:
http://blog.csdn.net/maopig/article/details/6982457
系統(tǒng)提供的socket緩沖區(qū)大小為8K,你可以將之設(shè)置為64K,尤其在傳輸實(shí)時視頻時。?
socket發(fā)送數(shù)據(jù)時候先把數(shù)據(jù)發(fā)送到socket緩沖區(qū)中,之后接受函數(shù)再從緩沖區(qū)中取數(shù)據(jù),如果發(fā)送端特別快的時候,緩沖區(qū)很快就被填滿(socket默認(rèn)的是1024×8=8192字節(jié)),這時候我們應(yīng)該根據(jù)情況設(shè)置緩沖區(qū)的大小,可以通過setsockopt函數(shù)實(shí)現(xiàn)
?#include <stdio.h>?
#include <stdlib.h>?
#include <unistd.h>?
#include <string.h>?
#include <errno.h>?
#include <sys/types.h>?
#include <sys/socket.h>?
#include <assert.h>?
?
int main(int argc,char **argv)?
{?
??? int err = -1;?? ??? ?/*?返回值?*/?
??? int s = -1;?? ??? ??? ?/*?socket描述符?*/?
??? int snd_size = 0;?? /*?發(fā)送緩沖區(qū)大小?*/?
??? int rcv_size = 0;?? ?/*?接收緩沖區(qū)大小?*/?
??? socklen_t optlen;?? ?/* 選項(xiàng)值長度 */?
?
??? /*?
???? * 建立一個TCP套接字?
???? */?
??? s = socket(PF_INET,SOCK_STREAM,0);?
??? if( s == -1){?
?? ??? ?printf("建立套接字錯誤\n");?
?? ??? ?return -1;?? ??
??? }?
??? ?
??? /*?
???? * 先讀取緩沖區(qū)設(shè)置的情況?
???? * 獲得原始發(fā)送緩沖區(qū)大小?
???? */?
??? optlen = sizeof(snd_size);?
??? err = getsockopt(s, SOL_SOCKET, SO_SNDBUF,&snd_size, &optlen);?
??? if(err<0){?
?? ??? ?printf("獲取發(fā)送緩沖區(qū)大小錯誤\n");?
??? }? ?
??? /*?
???? * 打印原始緩沖區(qū)設(shè)置情況?
???? */?
?
??? /*?
???? * 獲得原始接收緩沖區(qū)大小?
???? */?
??? optlen = sizeof(rcv_size);?
??? err = getsockopt(s, SOL_SOCKET, SO_RCVBUF, &rcv_size, &optlen);?
??? if(err<0){?
?? ??? ?printf("獲取接收緩沖區(qū)大小錯誤\n");?
??? }?
??? ?
?? printf(" 發(fā)送緩沖區(qū)原始大小為: %d 字節(jié)\n",snd_size);?
?? printf(" 接收緩沖區(qū)原始大小為: %d 字節(jié)\n",rcv_size);?
?
??? /*?
???? *?設(shè)置發(fā)送緩沖區(qū)大小?
???? */?
??? snd_size = 10*1024;??? /* 發(fā)送緩沖區(qū)大小為8K */?
??? optlen = sizeof(snd_size);?
??? err = setsockopt(s, SOL_SOCKET, SO_SNDBUF, &snd_size, optlen);?
??? if(err<0){?
?? ??? ?printf("設(shè)置發(fā)送緩沖區(qū)大小錯誤\n");?
??? }?
?
??? /*?
???? *?設(shè)置接收緩沖區(qū)大小?
???? */?
??? rcv_size = 10*1024;??? /* 接收緩沖區(qū)大小為8K */?
??? optlen = sizeof(rcv_size);?
??? err = setsockopt(s,SOL_SOCKET,SO_RCVBUF, (char *)&rcv_size, optlen);?
??? if(err<0){?
?? ??? ?printf("設(shè)置接收緩沖區(qū)大小錯誤\n");?
??? }?
?
??? /*?
???? * 檢查上述緩沖區(qū)設(shè)置的情況?
???? *?獲得修改后發(fā)送緩沖區(qū)大小?
???? */?
??? optlen = sizeof(snd_size);?
??? err = getsockopt(s, SOL_SOCKET, SO_SNDBUF,&snd_size, &optlen);?
??? if(err<0){?
?? ??? ?printf("獲取發(fā)送緩沖區(qū)大小錯誤\n");?
??? }? ?
?
??? /*?
???? *?獲得修改后接收緩沖區(qū)大小?
???? */?
??? optlen = sizeof(rcv_size);?
??? err = getsockopt(s, SOL_SOCKET, SO_RCVBUF,(char *)&rcv_size, &optlen);?
??? if(err<0){?
?? ??? ?printf("獲取接收緩沖區(qū)大小錯誤\n");?
??? }?
?
??? /*?
???? * 打印結(jié)果?
???? */?
??? printf(" 發(fā)送緩沖區(qū)大小為: %d 字節(jié)\n",snd_size);?
??? printf(" 接收緩沖區(qū)大小為: %d 字節(jié)\n",rcv_size);?
?
??? close(s);?
??? return 0;?
}?
運(yùn)行后的結(jié)果:
發(fā)送緩沖區(qū)原始大小為: 16384 字節(jié)
?接收緩沖區(qū)原始大小為: 87380 字節(jié)
?發(fā)送緩沖區(qū)大小為: 20480 字節(jié)
?接收緩沖區(qū)大小為: 20480 字節(jié)
從結(jié)果 看出ubuntu系統(tǒng)默認(rèn)的發(fā)送緩沖區(qū)大小:16384字節(jié),接收緩沖區(qū)87380字節(jié)
但是有個問題我設(shè)置的接收和發(fā)送緩沖區(qū)大小為:10*1024=10240字節(jié),但是實(shí)際用getoptsock得到卻是20480字節(jié)加了一倍。改成其他大小也是都是加倍。
這是由linux內(nèi)核的算法決定的。
總結(jié)
以上是生活随笔為你收集整理的linux下查看系统socket读写缓冲区的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 试管婴儿好做吗
- 下一篇: linux下recv 、send阻塞、非