#include <stdio.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/socket.h> #include <unistd.h> int main()
{
    int ret;
    int sockfd;
    int sockbuflen = 0;
    int len = sizeof(sockbuflen);     sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    if (sockfd < 0) {
        fprintf(stderr, "sockfd get error\n");
        return -1;
    }
    
    ret = getsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, (void *)&sockbuflen, &len);
    if (ret < 0) {
        fprintf(stderr, "getsockopt error\n");
        return -1;
    }
    printf("%d\n", sockbuflen);
    
    sockbuflen = 4480;
    setsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, (void *)&sockbuflen, len);
    
    ret = getsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, (void *)&sockbuflen, &len);
    if (ret < 0) {
        fprintf(stderr, "getsockopt error\n");
        return -1;
    }
    printf("%d\n", sockbuflen);     return 0;
}

函数用法,参数选项在《UNIX网络编程_卷1》第七章,套接字选项中有详细叙述,需要的可以查阅。

此处需要注意的是:

1.getsockopt() 参数中的len必须初始化成 sizeof(int) ,此处容易跟recvfrom中的addrlen混淆。

2.设置sockbuflen之后获取出来的数值是设置的2倍/*暂时没有深入探究原因*/

第一个原因是因为,看code

int sock_getsockopt(struct socket *sock, int level, int optname,
char *optval, int *optlen)
{
struct sock *sk = sock->sk; union
{
int val;
struct linger ling;
struct timeval tm;
} v; int lv=sizeof(int),len; if(get_user(len,optlen))
return -EFAULT; switch(optname)
{
     /*...*/case SO_SNDBUF:
v.val=sk->sndbuf;
break; case SO_RCVBUF:
v.val =sk->rcvbuf;
break;
     /*...*/default:
return(-ENOPROTOOPT);
}
len=min(len,lv);
if(copy_to_user(optval,&v,len))
return -EFAULT;
lenout:
if(put_user(len, optlen))
return -EFAULT;
return ;
}

当len为0时候,于copy_to_user中的len为0,所以optval,也就是getsockopt获取的数值实际上是没变的。

修改socket缓冲区大小的更多相关文章

  1. 修改帧大小和socket缓冲区大小(转)

    修改帧大小和socket缓冲区大小 MTU (最大传输单元)的缺省值为1500. 通过下面命令将其改为9000(jumbo frame) % ifconfig eth0 mtu 9000 socket ...

  2. Linux网卡调优篇-禁用ipv6与优化socket缓冲区大小

    Linux网卡调优篇-禁用ipv6与优化socket缓冲区大小 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.   一般在内网环境中,我们几乎是用不到IPV6,因此我们没有必要把多不 ...

  3. VS2015编译FFMPEG,修改FFmpeg缓冲区大小解决实时流解码丢包问题,FFmpeg错误rtsp流地址卡死的问题,设置超时

    之前尝试过很多网上利用Windows编译FFmpeg的文章,都没有办法编译X64位的FFmpeg,有些教程中有专门提到编译64位的FFmpeg需要下载mingw-w64-install,但是编译的过程 ...

  4. socket tcp缓冲区大小的默认值、最大值

    Author:阿冬哥 Created:2013-4-17 Blog:http://blog.csdn.net/c359719435/ Copyright 2013 阿冬哥 http://blog.cs ...

  5. 【Linux】tcp缓冲区大小的默认值、最大值

    Author:阿冬哥 Created:2013-4-17 Blog:http://blog.csdn.net/c359719435/ Copyright 2013 阿冬哥 http://blog.cs ...

  6. 修改Arduino串口缓冲区大小(转)

    本帖节选自<Arduino程序设计基础>第二版5.1.6串口缓冲区       在之前的示例程序中,我们都是采用人工输入测试数据的方式检验程序效果,Arduino每接收到一次数据,就会将数 ...

  7. Python网络编程——修改套接字发送和接收的缓冲区大小

    很多情况下,默认的套接字缓冲区大小可能不够用.此时,可以将默认的套接字缓冲区大小改成一个更合适的值. 1. 代码 # ! /usr/bin/env python # -*- coding: utf-8 ...

  8. Socket缓冲区探讨,是否有拆包的方式?

    Socket缓冲区探讨 本文主要探讨java网络套接字传输模型,并对如何将NIO应用于服务端,提高服务端的运行能力和降低服务负载. 1.1 socket套接字缓冲区 Java提供了便捷的网络编程模式, ...

  9. udp之关于linux udp收发包缓冲区大小

    1.修订单个socket的缓冲区大小:通过setsockopt使用SO_RCVBUF来设置接收缓冲区,该参数在设置的时候不会与rmem_max进行对比校验,但是如果设置的大小超过rmem_max的话, ...

随机推荐

  1. 使用 xhprof 进行性能分析

        xhprof 是 facebook 开发的一个PHP扩展,作用来是用来做性能剖析.其官网:http://pecl.php.net/package/xhprof   [安装] 1,下载最新的 t ...

  2. django中使用Form组件

    内容: 1.Form组件介绍 2.Form组件常用字段 3.Form组件校验功能 4.Form组件内置正则校验 参考:https://www.cnblogs.com/liwenzhou/p/87478 ...

  3. JQ-用户注册用到的图形验证码,短信验证码点击事件,切换active类

    // 点击切换图形验证码 页面加载完后执行,类似window.onload $(function () { var imgCaptcha = $(".img-captcha"); ...

  4. 框架之Tornado(简单介绍)

    引言 回想Django的部署方式 以Django为代表的python web应用部署时采用wsgi协议与服务器对接(被服务器托管),而这类服务器通常都是基于多线程的,也就是说每一个网络请求服务器都会有 ...

  5. 温故而知新-mysql的一些语法show,describe,explain,fulltext

    1 show show tables; 显示数据库的所有表 show databases; 显示所有数据库 show columns from table; 显示表的所有列 show grants f ...

  6. 得到当前对象在不同大小的页面中的绝对位置,及冒泡cancelBubble

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  7. leetcode263

    public class Solution { private bool Judge(int x) { ) { return false; } int bound = Convert.ToInt32( ...

  8. DDoS攻防战 (一) : 概述

    岁寒 然后知松柏之后凋也 ——论语·子罕 (此图摘自<Web脚本攻击与防御技术核心剖析>一书,作者:郝永清先生)    DDoS,即 Distributed Denial of Servi ...

  9. springboot - mybatis - 下划线与驼峰自动转换 mapUnderscoreToCamelCase

    以前都是在mybatis.xml中来配置,但是spring boot不想再用xml配置文件.网上搜寻了好久,才找到设置办法:sessionFactoryBean.getObject().getConf ...

  10. curl 请求https内容,返回空

    $ch = curl_init(); curl_setopt($ch, CURLOPT_URL,$api); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);/ ...