linux下檢視系統socket讀寫緩衝區
阿新 • • 發佈:2019-01-02
#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;
傳送緩衝區大小為: 20480 位元組
接收緩衝區大小為: 20480 位元組
從結果 看出ubuntu系統預設的傳送緩衝區大小:16384位元組,接收緩衝區87380位元組
#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核心的演算法決定的。