下面的两个函数主要是用于设置socket文件描述符属性的方法

getsockopt 和setsockopt这两个函数成功时返回0,失败时返回-1并设置errno ,可以使用 strerror(errno) 将错误码转换为对应的提示消息。

例子如下

/*查询和设置接收缓冲区*/
int recvbuf = 0;
int len = sizeof( recvbuf );
getsockopt( sock, SOL_SOCKET, SO_RCVBUF, &recvbuf, ( socklen_t* )&len);
DC_INFO( "the receive buffer size before settting is %d", recvbuf );recvbuf = size;
if(0 != setsockopt( sock, SOL_SOCKET, SO_RCVBUF, &recvbuf, sizeof( recvbuf) ))
{DC_ERROR("setsockopt SO_RCVBUF error ,errmsg = %s",strerror(errno));return SERVER_ERROR;
}

下面进行一些详细介绍

1.对于服务器而言,有部分socket选项只能在listen前针对监听socket设置才有效!这是因为连接socket只能由accept调用返回,而accept从listen监听队列中接受的连接至少已经完成了TCP三次握手的前两个步骤(因为listen监听队列中的连接至少已进入SYN_RCVD状态),这说明服务器已经往被接收连接上发出了TCP同步报文段。但有的socket选项却应该在TCP同步报文段中设置,比如TCP最大报文选项!对应的解决方案是:对监听socket设置这些socket选项,那么accept返回的连接socket将自动继承这些选项!

这些选项包括SO_DEBUG,SO_DONTROUTE,SO_LINGER,SO_OOBINLINE,SO_RCVBUF,SO_RCVLOWAT,SO_SNDBUF,SO_SNDLOWAT,TCP_MAXSEG和TCP_NODELAY。而对于客户端而言,这些socket必须在connect之前设置,因为connect调用成功之后 tcp的三次握手已经完成了!

2.SO_REUSEADDR选项

tcp服务器连接的TIME_WAIT状态,可以通过设置该选项是的绑定的socket地址立即被重用!

此外还有个另外的方式,修改内核参数 /proc/sys/net/ipv4/tcp_tw_recycle 来快速回收被关闭的socket ,从而使得tcp连接国标不会进入TIME_WAIT状态,进而使得程序可以立即重用本地的socket地址!

3.SO_RCVBUF 和SO_SNDBUF

这两个选项分别表示TCP接收缓冲区和发送缓冲区的大小!

不过当我们通过setsockopt来设置tcp的接受和发送缓冲区大小的时候,系统会将其值加倍,并且不得小于某个最小值,同时也不得超过最大值!不过每个系统值可能有不同的默认值!

此外我们还可以直接修改内核参数 /proc/sys/net/ipv4/tcp_rmem 和/proc/sys/net/ipv4/tcp_wmem 来强制修改tcp接收和发送缓冲区的限制!

代码如下

int SocketServer::make_socket_buffsize(int sock,int size)
{/*查询和设置接收缓冲区*/int recvbuf = 0;int len = sizeof( recvbuf );getsockopt( sock, SOL_SOCKET, SO_RCVBUF, &recvbuf, ( socklen_t* )&len);DC_INFO( "the receive buffer size before settting is %d", recvbuf );recvbuf = size;if(0 != setsockopt( sock, SOL_SOCKET, SO_RCVBUF, &recvbuf, sizeof( recvbuf) )){DC_ERROR("setsockopt SO_RCVBUF error ,errmsg = %s",strerror(errno));return SERVER_ERROR;}getsockopt( sock, SOL_SOCKET, SO_RCVBUF, &recvbuf, ( socklen_t* )&len);DC_INFO( "the receive buffer size after settting is %d", recvbuf );/*查询和设置发送缓冲区*/int sendbuf = 0;getsockopt( sock, SOL_SOCKET, SO_SNDBUF, &sendbuf, ( socklen_t* )&len);DC_INFO( "the tcp send buffer size before setting is %d", sendbuf );sendbuf = size;if(0 != setsockopt( sock, SOL_SOCKET, SO_SNDBUF, &sendbuf, sizeof( sendbuf) )){DC_ERROR("setsockopt SO_SNDBUF error ,errmsg = %s",strerror(errno));return SERVER_ERROR;}getsockopt( sock, SOL_SOCKET, SO_SNDBUF, &sendbuf, ( socklen_t* )&len);DC_INFO( "the tcp send buffer size after setting is %d", sendbuf );return SERVER_OK;
}

设置之后的最大值一般就是默认一次可以读取的字节数!

4.SO_RCVLOWAT 和SO_SNDLOWAT 选项

这两个选项分别表示tcp接受和发送缓冲区的低水位标志。它们一般被I/O复用系统调用来判断socket是否可读或可写。

当tcp接收缓冲区中可读数据的总数大于低水位标记时,I/O系统调用将通知应用程序可以从对于的socket读取数据,当TCP发送缓冲区中的空闲空间大于其低水位,将通知应用程序可以往对应的socket上写数据。

默认情况下,这两个选项均为1字节!

5.SO_LINGER

此选项指定函数close对面向连接的协议如何操作(如TCP)。内核缺省close操作是立即返回,如果有数据残留在套接口缓冲区中则系统将试着将这些数据发送给对方。

struct linger
{int l_onoff; /* 0 = off, nozero = on */int l_linger; /* linger time */
};

有下列三种情况:
1、设置 l_onoff为0,则该选项关闭,l_linger的值被忽略,等于内核缺省情况,close调用会立即返回给调用者,如果可能将会传输任何未发送的数据;
2、设置 l_onoff为非0,l_linger为0,close系统调用立即返回,TCP将丢弃保留在套接口发送缓冲区中的任何数据并发送一个RST给对方。
3、设置 l_onoff 为非0,l_linger为非0,此时的close的行为取决两个条件:一是被关闭的socket对应的TCP发送缓冲区是否还有残留的数据;二是该socket是阻塞的还是非阻塞的。对于阻塞的socket,close将等到l_linge的时间,直到tcp模块发送完所有残留数据并得到对方的确认。如果这段时间tcp没有发送完残留的数据,那么close将返回-1,并将errno设置为EWOULDBLOCK。如果该socket是非阻塞的,close将立即返回,此时我们需要根据返回值和errno来判断残留数据是否已经发送完毕!

socket 选项 详细说明相关推荐

  1. Socket编程中的强制关闭与优雅关闭及相关socket选项

    以下描述主要是针对windows平台下的TCP socket而言. 首先需要区分一下关闭socket和关闭TCP连接的区别,关闭TCP连接是指TCP协议层的东西,就是两个TCP端之间交换了一些协议包( ...

  2. Linux 高性能服务器编程——socket选项

    socket选项函数 功能:用来读取和设置socket文件描述符属性的方法 函数: #include <sys/scoket.h> int getsockopt ( int sockfd, ...

  3. Highcharts 配置语法;Highcharts 配置选项详细说明

    Highcharts 配置语法 本章节我们将为大家介绍使用 Highcharts 生成图表的一些配置. 第一步:创建 HTML 页面 创建一个 HTML 页面,引入 jQuery 和 Highchar ...

  4. socket选项: SO_REUSEADDR, SO_RCVBUF, SO_SNDBUF

    From: http://blog.csdn.net/jasonliuvip/article/details/22591531 最近在看<linux高性能服务器编程>,在此做个日记,以激励 ...

  5. Linux网络编程 | socket选项设定 及 网络信息API

    文章目录 读取和设置 socket 选项 SO_REUSEADDR SO_RCVBUF 和 SO_SNDBUF SO_RCVLOWAT 和 SO_SNDLOWAT SO_LINGER 选项 网络信息A ...

  6. Linux使用socket选项的定时器

    socket选项SO_RCVTIMEO和SO_SNDTIMEO 这个选项是专门针对socket系列的函数的,函数在下图中说明了.如果超时,就设置错误码,之后在流程中根据错误码判断是否超时. 先给出超时 ...

  7. 今天用Java开发主机IP扫描神器,零基础Socket编程详细

    目录 一.开发背景 二.准备工作 三.远程主机 IP 探测 四.核心算法 1.IP地址转化为十进制数 2.十进制数转化为IP地址 五.主机 IP 扫描神器界面 六.各功能代码及IP扫描演示 1.主机扫 ...

  8. 4.一起学习Highcharts 配置选项详细说明

    Highcharts 配置选项详细说明 Highcharts 提供大量的配置选项参数,您可以轻松定制符合用户要求的图表,本章节为大家详细介绍Highcharts 配置选项使用说明: 参数配置(属性+事 ...

  9. Socket选项概览

    http://www.cnblogs.com/ggjucheng/archive/2012/02/17/2355874.html 前言 socket选项主要是由setsockopt和getsockop ...

最新文章

  1. 互联网+和创业潮,互联网+前提条件是什么?互联网+做什么?
  2. elasticsearch建立索引操作的API
  3. 【 English 】与个人品质有关的英语词汇
  4. linux u8 头文件,2019-12-11 转载TCP/IP编程常用C语言头文件
  5. Git 技术篇 - git remote修改、移除仓库源的使用方法,git添加仓库源提示fatal: remote origin already exists.问题解决
  6. spring bean加载过程_Spring源码剖析3:Spring IOC容器的加载过程
  7. 教机器写代码:增强拓扑进化网络(NEAT)
  8. WF从入门到精通(第十章):事件活动 (转)
  9. django -orm操作总结
  10. 【转载】身份证号码验证算法
  11. 两个前端项目利用iframe进行通信
  12. HTML5期末大作业:旅游网页设计与实现——旅游风景区网站HTML+CSS+JavaScript 景点静态网页设计 学生DW静态网页设计
  13. 解决两台路由器串联上网问题
  14. 金字塔图像融合方法总结(一)
  15. 常用集合转JSON字符串公共类
  16. Membership 网站安全相关配置节
  17. 华为云OBS文件上传下载工具类
  18. ami免刷bios 开启bios设置
  19. 【数据结构】直接插入排序以及时间复杂度的分析
  20. 绝了!毕业10年年薪百万,今天总结一下我都学了什么!

热门文章

  1. mysql 清理 reley_MySQL日志相关
  2. eclipse 导入项目_JAVA编程实战:坦克大战系列2-坦克如何在eclipse中编写
  3. Adobe illustrator 直接选择工具删除白板 - 连载 6
  4. Advanced Science|北京大学第一医院肾脏内科杨莉团队与白凡研究组揭示急性肾损伤中始动和放大炎症巨噬细胞新亚群...
  5. Mac提示app损坏、Error,Mac电脑最常见错误的解决方案
  6. Neural Filters for mac(ps2021逆天滤镜库)无需登陆Adobe Id v22.0.1最新版使用教程
  7. Mac上时钟也能自定义的方法你知道吗
  8. java遍历子目录_Java遍历文件夹及子目录代码实例
  9. 【ES6(2015)】Module模块
  10. bpmn2.0业务过程模型和符号_IT帮业务架构学习小组学习内容