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

Linux套接字缓冲区设置

通过下面这行代码获取:

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

通过下面这行代码设置:

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

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

整体代码:

#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描述符*/
    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,当自己设置的值比这些值小的时候,系统默认最小值

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值