概述

有很多方法来获取和设置影响套接口的选项:

  • 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);
返回值:0——成功,-1——出错

其中,

sockfd必须指向一个打开的套接口描述字;

level(级别)指定系统中解释选项的代码:或为通用套接口代码,或为某个特定于协议的代码(例如IPv4、IPv6、TCP或SCTP)。

optval是一个指向变量(*optval)的指针,setsockopt从*optval中取得选项待设置的新值,getsockopt则把已获取的选项当前值存放到*optval中。

optlen指定*optval的大小,它对于setsockopt是一个值参数,对于getsockopt是一个值-结果参数。

套接口选项粗分为两大基本类型:

(1)标志选项:开启或禁止某个特性的二元选项。

(2)值选项:取得并返回我们可以设置或检查的特定值的选项。

*optval的值为0表示禁止选项,不为0表示开启选项。

fcntl函数

fcntl函数提供了与网络编程相关的如下特性:

  1. 非阻塞I/O。通过使用F_SETFL命令设置O_NONBLOCK文件状态标志,我们可以把一个套接口设置为非阻塞型。
  2. 信号驱动I/O。通过使用F_SETFL命令设置O_ASYNC文件状态标志,我们可以把一个套接口设置成一旦其状态发生变化,内核就产生一个SIGIO信号。
  3. F_SETOWN命令允许我们指定用于接收SIGIO和SIGURG信号的套接口属主(进程ID或进程组ID)。其中SIGIO信号是套接口被设置为信号驱动I/O型后产生的,SIGURG信号是在新的带外数据到达套接口时产生的。F_GETOWN命令返回套接口的当前属主。
#include <fcntl.h>
int fcntl(int fd, int cmd, ... /* int arg */);
返回值:依赖于cmd参数——成功,-1——出错

每种描述字(包括套接口描述字)都有一组由F_GETFL命令获取或由F_SETFL命令设置的文件标志。其中影响套接口描述字的两个标志是:

O_NONBLOCK   非阻塞I/O

O_ASYNC         信号驱动I/O

注意

设置某个文件状态标志的唯一正确的方法是:先取得当前标志,与新标志逻辑或后再设置标志。例如,使用fcntl开启非阻塞I/O的典型代码是:

int flags;if( (flags = fcntl(fd, F_GETFL, 0)) < 0)err_sys("F_GETFL error");
flags |= O_NONBLOCK;
if(fcntl(fd, F_SETFL, flags) < 0)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选项。

转载于:https://www.cnblogs.com/nufangrensheng/p/3591156.html

UNIX网络编程读书笔记:套接口选项相关推荐

  1. UNIX网络编程--读书笔记

    会集中这段时间写UNIX网络编程这本书的读书笔记,准备读三本,这一系类的文章会不断更新,一直会持续一个月多,每篇的前半部分是书中讲述的内容,每篇文章的后半部分是自己的心得体会,文章中的红色内容是很重要 ...

  2. 网络编程学习笔记(套接口超时)

    有三种方法给套接口上的I/O操作设置 超时: 1.调用 alarm,在到达指定时间 时产生 SIGALRM信号,可能与进程中其他已有的alarm调用 冲突 2.使用select阻塞在等待I/O上,se ...

  3. UNIX网络编程读书笔记:套接口地址结构

    前言 大多数套接口函数都需要一个指向套接口地址结构的指针作为参数.每个协议族都定义它自己的套接口地址结构.这些结构的名字均以"sockaddr_"开头,并以对应每个协议族的唯一后缀 ...

  4. Unix 网络编程 读书笔记1

    第一章: C/C++语言提供两种不同的编程模式:IPL32和PL64. ► IPL32 ● 表示integer/pointer/long三种数据类型是32位(4个字节),在这种模式下,提供32 位的地 ...

  5. UNIX网络编程读书笔记:辅助数据

    辅助数据(ancillary data)可通过调用sendmsg和recvmsg这两个函数,使用msghdr结构中的msg_control和msg_controllen这两个成员发送和接收. 辅助数据 ...

  6. UNIX网络编程.卷1,套接字联网API(第3版)(中文版)(Stevens经典著作,两位顶级网络编程专家应邀执笔修订)...

    UNIX网络编程.卷1,套接字联网API(第3版)(中文版)(Stevens经典著作,两位顶级网络编程专家应邀执笔修订) 基本信息 原书名: Unix Network Programming, Vol ...

  7. UNIX网络编程学习笔记(代码超详细解析)(持续更新)

    1. 其他函数准备 1. TCP 回射服务器程序: str_echo 函数 #include "unp.h"void str_echo(int sockfd) {ssize_t n ...

  8. 2021版!万字UNIX网络编程学习笔记(套接字篇)

    目录 1.一个简单的时间获取服务器的程序 2.套接字篇 2.1 套接字简介 2.2 套接字中常用的函数 2.3 基本TCP套接字编程 2.3.1.socket函数 2.3.2 connect函数 2. ...

  9. UNIX网络编程——基本TCP套接字编程 【转贴】

    一.基于TCP协议的网络程序 下图是基于TCP协议的客户端/服务器程序的一般流程: 服务器调用socket().bind().listen()完成初始化后,调用accept()阻塞等待,处于监听端口的 ...

最新文章

  1. javascript身份证号码验证函数支持带x
  2. [20170728]oracle保留字.txt
  3. 1.1 Java异常(Exception)处理及常见异常
  4. 域创实业谋定功能性-农业大健康·万祥军:借创新引领潮流
  5. 数据库:为什么阿里巴巴禁止使用存储过程?
  6. Exynos4412启动过程分析
  7. 内存拷贝函数memcpy
  8. cesium获取模型高度_Cesium中地形数据的加载
  9. 学前教育与计算机,计算机与幼儿教育
  10. 运行含中文的程序,打印名片
  11. Jtable 表格按多列排序(支持中文汉字排序)
  12. 一网打尽位图与矢量图
  13. e470c拆机图解全拆 thinkpad_THINKPAD e470硬盘拆解教程是?
  14. 微信支付服务器sdk升级,微信支付接口上手指引附微信SDK更新说明.PDF
  15. IEEE TGRS2019|【论文笔记】R2-CNN: Fast Tiny Object Detection in Large-Scale Remote Sensing Images
  16. Linux驱动之platform设备驱动
  17. Swift - 给图片添加滤镜效果(棕褐色老照片滤镜,黑白滤镜)
  18. 人工智能的就业方向有哪些?
  19. Java基础以及变量和运算符、包机制、javadoc生成
  20. 物联网卡发展历程与发展趋势

热门文章

  1. vbs学习笔记2——创建桌面快捷方式
  2. 最优秀的5个Linux文本编辑器
  3. html如何整齐排列选择框,html – 如何均匀地排列多个内嵌块元素?
  4. android xml黑体字_为 Android 换上任意喜欢的字体,你可以试试这个 Magisk 模块
  5. java多线程的底层实现_多线程的底层实现机制 - 欢迎来到古怪匹诺曹的开发世界 - OSCHINA - 中文开源技术交流社区...
  6. PostgreSQL 12系统表(8)pg_indexes
  7. python的匿名函数返回值_Python匿名函数返回值输出问题望指点
  8. matlab参数摄动仿真,《过程控制工程及仿真:基于MATLAB/Simulink》随书光盘
  9. 嵌入式linux工程师 考试,嵌入式Linux工程师常见笔试题.doc
  10. oracle使用nbu的必要,nbu恢复oracle,使用与源备份端不同用户问题解决