修改socket缓冲区大小
#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缓冲区大小的更多相关文章
- 修改帧大小和socket缓冲区大小(转)
修改帧大小和socket缓冲区大小 MTU (最大传输单元)的缺省值为1500. 通过下面命令将其改为9000(jumbo frame) % ifconfig eth0 mtu 9000 socket ...
- Linux网卡调优篇-禁用ipv6与优化socket缓冲区大小
Linux网卡调优篇-禁用ipv6与优化socket缓冲区大小 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一般在内网环境中,我们几乎是用不到IPV6,因此我们没有必要把多不 ...
- VS2015编译FFMPEG,修改FFmpeg缓冲区大小解决实时流解码丢包问题,FFmpeg错误rtsp流地址卡死的问题,设置超时
之前尝试过很多网上利用Windows编译FFmpeg的文章,都没有办法编译X64位的FFmpeg,有些教程中有专门提到编译64位的FFmpeg需要下载mingw-w64-install,但是编译的过程 ...
- socket tcp缓冲区大小的默认值、最大值
Author:阿冬哥 Created:2013-4-17 Blog:http://blog.csdn.net/c359719435/ Copyright 2013 阿冬哥 http://blog.cs ...
- 【Linux】tcp缓冲区大小的默认值、最大值
Author:阿冬哥 Created:2013-4-17 Blog:http://blog.csdn.net/c359719435/ Copyright 2013 阿冬哥 http://blog.cs ...
- 修改Arduino串口缓冲区大小(转)
本帖节选自<Arduino程序设计基础>第二版5.1.6串口缓冲区 在之前的示例程序中,我们都是采用人工输入测试数据的方式检验程序效果,Arduino每接收到一次数据,就会将数 ...
- Python网络编程——修改套接字发送和接收的缓冲区大小
很多情况下,默认的套接字缓冲区大小可能不够用.此时,可以将默认的套接字缓冲区大小改成一个更合适的值. 1. 代码 # ! /usr/bin/env python # -*- coding: utf-8 ...
- Socket缓冲区探讨,是否有拆包的方式?
Socket缓冲区探讨 本文主要探讨java网络套接字传输模型,并对如何将NIO应用于服务端,提高服务端的运行能力和降低服务负载. 1.1 socket套接字缓冲区 Java提供了便捷的网络编程模式, ...
- udp之关于linux udp收发包缓冲区大小
1.修订单个socket的缓冲区大小:通过setsockopt使用SO_RCVBUF来设置接收缓冲区,该参数在设置的时候不会与rmem_max进行对比校验,但是如果设置的大小超过rmem_max的话, ...
随机推荐
- 查看linux服务器CPU数量
首先,要区分两个概念:物理CPU和逻辑CPU. 物理CPU就是服务器上实际安装的CPU.但是一个物理CPU可以有多个核.例如,一个 i5 760 是双核,而一个 i5 2250 是四核.如果开启了In ...
- virtualenv之python虚拟环境
virtualEnv可以方便的解决不同项目中,对类库的依赖问题.首先将常用的类库安装在系统环境中,然后为每个项目安装独立的类库环境.这样子可以保证每个项目都运行在独立的类库环境中. virtualen ...
- Python之模块(二)
1.subprocess模块 2.loggin模块 很多程序都有记录日志的需求,并且日志中包含的信息即有正常的程序访问日志,还可能有错误.警告等信息输出,python的logging模块提供了标准的日 ...
- Jsch - java SFTP 文件上传下载
使用Jsch上传.下载文件,核心步骤是:获取channel,然后使用get/put方法下载.上传文件 核心代码句: session = jSch.getSession(ftpUserName, ftp ...
- Dictionary 字典的使用
Dim a, d, i '创建几个变量Set d = CreateObject("Scripting.Dictionary")d.Add "a&q ...
- javarscript在HTML中的调用方式 (直接调用 和文件调用)
//文件调用<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...
- as3 文档类引用
/**文档类引用**/ public static var main:CoverMain; public function CoverMain() { main=this; }
- htop工具使用
1 防止进程重复显示 在使用htop查看进程信息的时候,经常会出现很多个进程重复的情况,如下情况: 经研究发现,htop会把一个进程里的线程当做一个进程来显示出来,上图中的java进程有多个线程,所以 ...
- 安装oracle后java -version命令显示 jdk version "1.3.1"的原因
因为先装的JDK,后装了oracle,oracle的JDK配置把原来的jdk路径替换掉了. 我的电脑->属性->高级->环境变量->系统变量->PATH ,把JDK的路径 ...
- Java Magic. Part 4: sun.misc.Unsafe
Java Magic. Part 4: sun.misc.Unsafe @(Base)[JDK, Unsafe, magic, 黑魔法] 转载请写明:原文地址 系列文章: -Java Magic. P ...