UNIX网络编程读书笔记:套接口选项
概述
有很多方法来获取和设置影响套接口的选项:
- getsockopt和setsockopt函数
- fcntl函数
- ioctl函数
getsockopt和setsockopt函数
这两个函数仅用于套接口。
#include <sys/socket.h>
int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen);
int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t *optlen);
返回值:——成功,-——出错
其中,
sockfd必须指向一个打开的套接口描述字;
level(级别)指定系统中解释选项的代码:或为通用套接口代码,或为某个特定于协议的代码(例如IPv4、IPv6、TCP或SCTP)。
optval是一个指向变量(*optval)的指针,setsockopt从*optval中取得选项待设置的新值,getsockopt则把已获取的选项当前值存放到*optval中。
optlen指定*optval的大小,它对于setsockopt是一个值参数,对于getsockopt是一个值-结果参数。
套接口选项粗分为两大基本类型:
(1)标志选项:开启或禁止某个特性的二元选项。
(2)值选项:取得并返回我们可以设置或检查的特定值的选项。
*optval的值为0表示禁止选项,不为0表示开启选项。
fcntl函数
fcntl函数提供了与网络编程相关的如下特性:
- 非阻塞I/O。通过使用F_SETFL命令设置O_NONBLOCK文件状态标志,我们可以把一个套接口设置为非阻塞型。
- 信号驱动I/O。通过使用F_SETFL命令设置O_ASYNC文件状态标志,我们可以把一个套接口设置成一旦其状态发生变化,内核就产生一个SIGIO信号。
- F_SETOWN命令允许我们指定用于接收SIGIO和SIGURG信号的套接口属主(进程ID或进程组ID)。其中SIGIO信号是套接口被设置为信号驱动I/O型后产生的,SIGURG信号是在新的带外数据到达套接口时产生的。F_GETOWN命令返回套接口的当前属主。
#include <fcntl.h>
int fcntl(int fd, int cmd, ... /* int arg */);
返回值:依赖于cmd参数——成功,-——出错
每种描述字(包括套接口描述字)都有一组由F_GETFL命令获取或由F_SETFL命令设置的文件标志。其中影响套接口描述字的两个标志是:
O_NONBLOCK 非阻塞I/O
O_ASYNC 信号驱动I/O
注意
设置某个文件状态标志的唯一正确的方法是:先取得当前标志,与新标志逻辑或后再设置标志。例如,使用fcntl开启非阻塞I/O的典型代码是:
int flags; if( (flags = fcntl(fd, F_GETFL, )) < )
err_sys("F_GETFL error");
flags |= O_NONBLOCK;
if(fcntl(fd, F_SETFL, flags) < )
err_sys("F_SETFL error");
信号SIGIO和SIGURG的独特之处
信号SIGIO和SIGURG与其他信号的不同之处在于,这两个信号仅在已使用F_SETOWN命令给相关套接口指派了属主后才会产生。
F_SETOWN命令的整数类型arg参数既可以是一个正整数,指出接收信号的进程ID,也可以是一个负整数,其绝对值指出接收信号的进程组ID。
F_GETOWN命令把套接口属主作为fcntl函数的返回值返回,它既可以是进程ID(一个正的返回值),也可以是进程组ID(一个除-1以外的负值)。
指定接收信号的套接口属主为一个进程或一个进程组的差别在于:前者仅导致单个进程接收信号,而后者则导致整个进程组中的所有进程(也许不止一个进程)接收信号。
使用socket函数新创建的套接口并没有属主。然而如果一个新的套接口是从一个监听套接口创建来的,那么套接口属主将由已连接套接口从监听套接口继承而来。
最常用的套接口选项
SO_KEEPALIVE
给一个TCP套接口设置保持存活(keep-alive)选项后,如果2小时内在该套接口的任一方向上都没有数据交换,TCP就自动给对端发送一个保持存活探测分节(keep-alive probe)。这是一个对端必须响应的分节。
本选项的目的是检测对端主机是否崩溃或变得不可达。
本选项一般由服务器使用,不过客户也可以使用。
服务器使用本选项是因为它们花大部分时间阻塞在等待穿越TCP连接的输入上,也就是说在等待客户的请求。然而如果客户主机连接掉线、电源掉电或系统崩溃,服务器进程将永远不会知道,并将继续等待永远不会到达的输入。我们称这种情况为半开连接(half-open connection)。保持存活选项将检测出这些半开连接并终止它们。
SO_RCVBUF、SO_SNDBUF
每个TCP套接口和SCTP套接口都有一个发送缓冲区和一个接收缓冲区,每个UDP套接口都有一个接收缓冲区。SO_SNDBUF和SO_RCVBUF套接口选项允许我们改变这些缓冲区的大小。对于客户,SO_RCVBUF选项必须在调用connect之前设置;对于服务器,SO_RCVBUF选项必须在调用listen之前给监听套接口设置。
SO_REUSEADDR
SO_REUSEADDR套接口选项为以下四个不同的目的提供服务:
(1)SO_REUSEADDR允许启动一个监听服务器并捆绑其众所周知端口,即使以前建立的将该端口用作它们的本地端口的连接仍存在。
(2)SO_REUSEADDR允许在同一端口上启动对同一服务器的多个实例,只要每个实例捆绑一个不同的本地IP地址即可。
(3)SO_REUSEADDR允许单个进程捆绑同一端口到多个套接字上,只要每次捆绑指定不同的本地IP地址即可。
(4)SO_REUSEADDR允许完全重复的绑定:当一个IP地址和端口已绑定到某个套接口上时,如果传输协议支持,同样的IP地址和端口可以捆绑到另一个套接口上。一般来说,本特性只支持UDP套接口。
所有TCP服务器都应指定SO_REUSEADDR选项。
UNIX网络编程读书笔记:套接口选项的更多相关文章
- UNIX网络编程读书笔记:原始套接口
概述 应用程序可以绕过传输层而直接使用IPv4和IPv6,这称为原始套接口(raw socket).http://www.cnblogs.com/nufangrensheng/p/3583435.ht ...
- UNIX网络编程读书笔记:基本SCTP套接口编程
概述 SCTP是一个较新的传输协议,于2000年在IETF得到标准化(TCP是在1981年标准化的).它最初是为满足不断增长的IP电话市场设计的:具体地说,就是穿越因特网传输电话信令. SCTP是一个 ...
- UNIX网络编程读书笔记:基本UDP套接口编程
概述 使用UDP编写的一些流行的应用程序有:DNS(域名系统).NFS(网络文件系统)和SNMP(简单网络管理协议). 如下图所示,给出了典型的UDP客户/服务器程序的函数调用: 客户不与服务器建立连 ...
- UNIX网络编程--读书笔记
会集中这段时间写UNIX网络编程这本书的读书笔记,准备读三本,这一系类的文章会不断更新,一直会持续一个月多,每篇的前半部分是书中讲述的内容,每篇文章的后半部分是自己的心得体会,文章中的红色内容是很重要 ...
- UNIX网络编程读书笔记:简介
认知套接口编程接口 理解原始套接口(raw socket)的概念 值得注意的是,客户和服务器是典型的用户进程,而TCP和IP协议则通常是系统内核协议栈的一部分. 上图中在TCP和UDP之间留有间隙 ...
- UNIX网络编程读书笔记:UNIX域协议
概述 UNIX域协议并不是一个实际的协议族,而是在单个主机上执行客户/服务器通信的一种方法,所用API与在不同主机上执行客户/服务器通信所用的API(套接口API)相同.UNIX域协议可视为进程间通信 ...
- UNIX网络编程读书笔记:select函数
select函数概况: select函数允许进程指示内核等待多个事件中的任何一个发生,并仅在有一个或多个事件发生或经历一段指定的时间后才唤醒它. 作为一个例子,我们可以调用select,告知内核仅在下 ...
- UNIX网络编程读书笔记:recvmsg和sendmsg函数
这两个函数是最通用的I/O函数.实际上我们可以把所有read.readv.recv和recvfrom调用替换成recvmsg调用.类似地,各种输出函数调用也可以替换成sendmsg调用. #inclu ...
- UNIX网络编程读书笔记:TCP输出、UDP输出和SCTP输出
TCP输出 下图展示了应用进程写数据到TCP套接口的过程. 每一个TCP套接口有一个发送缓冲区,我们可以用SO_SNDBUF套接口选项来改变这个缓冲区的大小. 当应用进程调用write时,内核从应用进 ...
随机推荐
- wpf企业级开发中的几种常见业务场景
前阵子在公司弄个内部的进销存管理系统,从了解需求.系统设计到编码,大约耗费了两个月时间,后来公司有了其他的安排,这东西就算黄了.顺便吐槽一下,厂里的一些人说话真心不顾别人感受,邮件啥的没一句舒服的.不 ...
- Wannafly挑战赛17 B
题解 大概就是求证这个 \[\sum_i^nC_{n}^i*C_n^i = C_{2n}^n\] 证明: \[(1+x)^{2n} = [C(0,n)+C(1,n)*x+...+C(n,n)*x^n] ...
- Tsinsen Palisection
建回文树. 正反建统计一种前缀和求出所有不相交的,用总数减去就是答案数. 在这里我们可以知道一个字符串中所有回文串的个数即为num数组之和(因为以一个节点为回文串结尾的字串都是唯一的) 也可以是cnt ...
- BZOJ1002: [FJOI2007]轮状病毒 (DP)
标准做法似乎应该是计算生成树数量的基尔霍夫矩阵之类的.. 我看到的做法是一个神奇的高精度dp,当然以后这个blahblahblah矩阵还是要搞一下.. 参考(抄袭)网址 这个dp的原理就是把环 ...
- 扩展gcd codevs 1213 解的个数
codevs 1213 解的个数 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 已知整数x,y满足如下面的条件: ax+by ...
- jQuery对象和Javascript对象
jQuery 对象是通过 jQuery 包装DOM 对象后产生的对象.jQuery 对象是 jQuery 独有的,其可以使用 jQuery 里的方法,但是不能使用 DOM 的方法:例如: $(&quo ...
- ES6 Javascript 实用开发技巧
ES6 实用开发技巧 定义变量/常量 ES6 中新增加了 let 和 const 两个命令,let 用于定义变量,const 用于定义常量 两个命令与原有的 var 命令所不同的地方在于,let, c ...
- ExtJS表格——行号、复选框、选择模型
本篇的内容是为表格添加行号,和复选框,最后谈一下Ext的选择模型.内容比较简单,就直接上代码了.一. 设置行号 行号的设置主要问题在于删除某一行后需要重新计算行号 Ext.onReady(fun ...
- Inrush limiter also provides short-circuit protection
For containing large amounts of bulk capacitance, controlling inrush currents poses problems. The si ...
- 一、 Log4E插件下载
下载地址:http://log4e.jayefem.de/content/view/3/2/ 二.安装Log4E插件 将下载下来的压缩包解压缩,如下图所示: 解压缩生成的[de.jayefem.log ...