一:linux下查看系統socket讀寫緩沖區大小配置:
http://blog.csdn.net/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.csdn.net/maopig/article/details/6982457
系統提供的socket緩沖區大小為8K,你可以將之設置為64K,尤其在傳輸實時視頻時。?
socket發送數據時候先把數據發送到socket緩沖區中,之后接受函數再從緩沖區中取數據,如果發送端特別快的時候,緩沖區很快就被填滿(socket默認的是1024×8=8192字節),這時候我們應該根據情況設置緩沖區的大小,可以通過setsockopt函數實現
?#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;?? /*?發送緩沖區大小?*/?
??? 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內核的算法決定的。