socket发送缓存和接收缓存大小的获取和设置

通过下面这行代码获取:

getsockopt(s , SOL_SOCKET , SO_SNDBUF , &snd_size , &optlen);

通过下面这行代码设置:

setsockopt(s , SOL_SOCKET , SO_SNDBUF , &snd_size , optlen);

我想把发送缓冲区设置为4096,接收缓冲区设置为8192

整体代码:

#include
#include
#include
#include
#include
#include
#include
#include
int main(int argc , char* argv[]){
    int err = -1;    /*返回值*/
    int s = -1;      /*socket描述符*/
    unsigned long  snd_size = 0;/*发送缓冲区大小*/
    unsigned long  rcv_size = 0;/*选项值长度*/
    socklen_t optlen;/*选项值长度*/ 
    /*
    *建立一个TCP套接字
    */
    s = socket(PF_INET , SOCK_STREAM , 0);
    if(s == -1){
       printf("建立套接字错误!!!");   
       return -1;  
    }
    /*
    *先读取缓冲区设置的情况
    *获得原始发送缓冲区大小
    */
    optlen = sizeof(snd_size);
    err = getsockopt(s , SOL_SOCKET , SO_SNDBUF , &snd_size , &optlen);
    if(err){
       printf("获取发送缓冲区大小错误!!!\n");
       return -1;     
    }
    /*
    打印原始缓冲区设置情况
    */
    printf("发送缓冲区原始大小为:%ld \n" , snd_size);
    /*
    *获取原始接收缓冲区大小
    */
    optlen = sizeof(rcv_size);
    err = getsockopt(s , SOL_SOCKET , SO_RCVBUF , &rcv_size , &optlen);
    if(err){
        printf("获取接收缓冲区大小错误!!!\n");
        return -1;
    }   
    /*
    打印原始接收缓冲区设置情况
    */
    printf("接收缓冲区原始大小为:%ld \n" , rcv_size);
//=====================================================================================================================
    /*
    *设置发送缓冲区大小
    */
    snd_size = 4096; /*发送缓冲区大小为4k*/
    optlen = sizeof(snd_size);
    err = setsockopt(s , SOL_SOCKET , SO_SNDBUF , &snd_size , optlen);
    if(err){
       printf("获取发送缓冲区大小错误!!!\n");
       return -1;     
    }
     /*
    *设置接收缓冲区大小
    */
    rcv_size = 8192; /*发送缓冲区大小为4k*/
    optlen = sizeof(rcv_size);
    err = setsockopt(s , SOL_SOCKET , SO_RCVBUF , &rcv_size , optlen);
    if(err){
       printf("设置发送缓冲区大小错误!!!\n");
       return -1;     
    }  
    if(err){
       printf("设置接收缓冲区大小错误!!!\n");
       return -1;     
    }
//==================================================================================================================    
    /*
    检查缓冲区设置后的情况
    */
     /*
    *先读取缓冲区设置的情况
    *获得原始发送缓冲区大小
    */
    optlen = sizeof(snd_size);
    err = getsockopt(s , SOL_SOCKET , SO_SNDBUF , &snd_size , &optlen);
    if(err){
       printf("获取发送缓冲区大小错误!!!\n");
       return -1;     
    }
    /*
    打印原始缓冲区设置情况
    */
    printf("修改后发送缓冲区原始大小为:%ld \n" , snd_size);
    /*
    *获取原始接收缓冲区大小
    */
    optlen = sizeof(rcv_size);
    err = getsockopt(s , SOL_SOCKET , SO_RCVBUF , &rcv_size , &optlen);
    if(err){
        printf("获取接收缓冲区大小错误!!!\n");
        return -1;
    }   
    /*
    打印原始接收缓冲区设置情况
    */
    printf("修改后接收缓冲区原始大小为:%ld \n" , rcv_size);

    return 0;
}

运行结果:

但是修改后的发送缓冲区为8192,修改后的接收缓冲区为16384,它们并不是我们设置的值,这是因为linux内核设置的最小的发送缓冲区为8192,接收缓冲区为16384,当自己设置的值比这些值小的时候,系统默认最小值

你可能感兴趣的:(socket发送缓存和接收缓存大小的获取和设置)