1. 程式人生 > >linux下檢視系統socket讀寫緩衝區

linux下檢視系統socket讀寫緩衝區

#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核心的演算法決定的。