linux设置套接字缓冲区的大小

该文章转载自http://blog.csdn.net/maopig/article/details/6982457


系统提供的socket缓冲区大小为8K,你可以将之设置为64K,尤其在传输实时视频时。 

socket发送数据时候先把数据发送到socket缓冲区中,之后接受函数再从缓冲区中取数据,如果发送端特别快的时候,缓冲区很快就被填满(socket默认的是1024×8=8192字节),这时候我们应该根据情况设置缓冲区的大小,可以通过setsockopt函数实现 #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内核的算法决定的。


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux原始套接字(Raw Socket)是一种特殊的套接字类型,它允许应用程序直接访问网络协议栈,以实现更底层的网络操作。setsockopt函数是用于设置套接字选项的函数之一,可以用于配置原始套接字的一些参数。下面是使用setsockopt函数设置原始套接字选项的一般步骤: 1. 创建原始套接字: 首先,使用socket函数创建一个原始套接字。例如,可以使用以下代码创建一个IPv4的原始套接字: ``` int sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_RAW); ``` 2. 设置套接字选项: 使用setsockopt函数设置套接字选项。该函数的原型如下: ``` int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen); ``` - sockfd:原始套接字的文件描述符。 - level:选项所属的协议层级,对于原始套接字,通常为SOL_SOCKET。 - optname:选项名称,可以是以下之一: - SO_RCVBUF:设置接收缓冲区大小。 - SO_SNDBUF:设置发送缓冲区大小。 - SO_RCVTIMEO:设置接收超时时间。 - SO_SNDTIMEO:设置发送超时时间。 - 其他选项,请参考相关文档。 - optval:指向包含选项值的缓冲区。 - optlen:选项值的长度。 例如,设置接收缓冲区大小为4096字节的代码如下: ``` int buffer_size = 4096; setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &buffer_size, sizeof(buffer_size)); ``` 3. 其他操作: 根据需要,可以进行其他操作,如绑定地址、发送和接收数据等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值