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

通过下面这行代码获取:

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

  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在 C++ 中设置 UDP 套接字发送接收缓冲区大小可以使用 `setsockopt()` 函数来实现。下面是设置发送缓存大小接收缓存大小的示例代码: ```c++ #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #include <iostream> using namespace std; int main() { int sockfd = socket(AF_INET, SOCK_DGRAM, 0); if (sockfd < 0) { cerr << "Error opening socket" << endl; return 1; } // 设置发送缓存大小 int sendbuf = 1024 * 1024; // 1MB if (setsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, &sendbuf, sizeof(sendbuf)) == -1) { cerr << "Error setting send buffer size" << endl; return 1; } // 设置接收缓存大小 int recvbuf = 1024 * 1024; // 1MB if (setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &recvbuf, sizeof(recvbuf)) == -1) { cerr << "Error setting receive buffer size" << endl; return 1; } // 输出设置后的缓存大小 int sendbuf_new, recvbuf_new; socklen_t len = sizeof(sendbuf_new); if (getsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, &sendbuf_new, &len) == -1) { cerr << "Error getting send buffer size" << endl; return 1; } cout << "Send buffer size: " << sendbuf_new << endl; len = sizeof(recvbuf_new); if (getsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &recvbuf_new, &len) == -1) { cerr << "Error getting receive buffer size" << endl; return 1; } cout << "Receive buffer size: " << recvbuf_new << endl; close(sockfd); return 0; } ``` 在上面的示例代码中,我们首先创建了一个 UDP 套接字,并设置发送缓存大小接收缓存大小为 1MB。然后,我们使用 `getsockopt()` 函数获取设置后的缓存大小,并输出结果。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值