通用套接字选项和TCP套接字选项
1. 套接字选项函数原型:
#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); ret-成功返回0 失败返回-
2. 通用套接字选项:
(1) SO_BROADCAST:
本选项开启或禁止进程发送广播消息的能力;只有数据报套接字支持广播,并且还必须是在支持广播消息的网络上;
(2) SO_DEBUG:
本选项仅由TCP支持。当给一个TCP套接字开启本选项,内核将为TCP在该套接字和接收的所有分组保留详细跟踪信息。这些信息保存在内核的某个环形缓冲区中,并可以使用trpt程序进行检查;
(3) SO_DONTROUTE:
本选项规定外出的分组将绕过底层协议的正常路由机制,以强制将分组从特定接口送出;
(4) SO_ERROR:
当一个套接字上发生错误时,源自Berkeley的内核中的协议模块将该套接字的名为so_error的变量设为标准的Unix_Exxx值中的一个,我们称它为该套接字的待处理错误。内核能够以下面的两种方式之一立即通知进程这个错误;
--如果进程阻塞在对该套接字的select调用上,那么无论是检查可读条件还是可写条件,select均返回并设置其中一个或所有两个条件;
--如果进程使用信号驱动式I/O模型,那就给进程或者进程产生一个SIGIO信号;
进程然后可以通过访问SO_ERROR套接字选项后去so_error值。由getsockopt返回的整数值就是该套接字的待处理错误。so_error随后由内核复位为0;
(5) SO_KEEPALIVE:
给一个tcp套接字设置保持存活选项后,如果2小时内在该套接字的任一方向上没有数据交换,tcp就自动给对端发送一个保持存活探测分节。这是一个对端必须响应的tcp分节,它会导致以下三种情况之一;
--对端以期望的ack响应。应用进程得不到通知。在又经过无动静的2小时之后,tcp将发出另外一个探测分节;
--对端以rst响应,它告知本端tcp,对端已崩溃且重新启动。该套接字的待处理错误被置ECONNRESET,套接字本身则被关闭;
--对端对保持存活探测分节没有任何响应。源自Berkeley的tcp将另外发送8个探测分节,两两相隔75秒,视图得到一个响应。如果探测分节没有响应,该套接字的处理错误被置为ETIMEOUT;
(6) SO_LINGER:
--shutdown, SHUT_RD: 在套接字上不能再发出接收请求,进程仍可以网套接字发送时数据,套接字接收缓冲区中所有数据被丢弃;再接收到任何的tcp丢弃;对套接字发送缓冲区没有任何影响;
--shutdown, SHUT_WR: 在套接字上不能再发出发送请求,进程仍可以从套接字接收数据,套接字发送缓冲区中的内容被发送到对端,后跟正常的tcp连接终止序列,即发送fin,对套接字接收缓冲区没有任何影响;
--close,l_onoff=0: 在套接字上不能再发出发送或者接收请求;套接字发送缓冲区中的内容被发送到对端,如果描述符引用计数变为0,在发送完发送缓冲区中的数据后,跟以正常的tcp连接终止序列,套接字接收缓冲区中的内容被丢弃;
--close,l_onoff = 1, l_linger = 0: 在套接字上不能再发出发送或接收请求;如果描述符引用计数变为0,rst被发送到对端;连接状态被置为CLOSED(没有TIME_WAIT);套接字发送缓冲区和套接字接收缓冲区中的数据被丢弃;
--close, l_onoff = 1, l_linger != 0: 在套接字上不能再发出发送或者接收请求;套接字发送缓冲区的数据被发送到对端;如果描述符引用计数为0,在发送完缓冲区中的数据后,跟以正常的tcp连接终止序列;套接字接收缓冲区的数据被丢弃;如果在连接变为CLOSED状态前延滞时间到,那么colose返回EWOULDBLOCK错误;
(7) SO_RCVBUF, SO_SNDBUF:
每个套接字都有一个发送缓冲区和一个接收缓冲区;TCP套接字的缓冲区大小至少应该是MSS的4倍;MSS=MTU-40头部,一般以太网卡MTU是1500;典型缓冲区默认大小是8192字节或者更大;对于一次发送大量数据,可以增加到48K,64K等;为了达到最佳性能,缓冲区可能至少要与BDP(带宽延迟乘积)一样大小;对于接收大量数据的,提高接收缓冲区能够减少发送端的阻塞;
TCP设置这个两个选项注意顺序:对于客户端必须在调用connect之前,对于服务器端应该在调用listen之前,因为窗口选项是在建立连接时用syn分节与对端互换得到的;
(8) SO_RCVLOWAT, SO_SNDLOWAT:
每个套接字还有一个接收低水位标记和一个发送低水位标记。他们由select函数使用,接收低水位标记是让select返回可读时套接字接收缓冲区中所需的数据量;对于tcp,udp,默认值是1;发送低水位标记是让select返回可写时套接字发送缓冲区中所需的可用空间;对于tcp套接字,其默认值通常为2048;
(9) SO_RCVTIMEO, SO_SNDTIMEO:
这两个选项允许我们给套接字的接收和发送设置一个超时值,注意,访问getsockopt和setsockopt函数的参数是指向timeval的指针,与select所用的参数相同;
(10) SO_TYPE:
本选项返回套接字的类型,返回的整数值是一个注入SOCK_STREAM或者SOCK_DGRAM之类的值;本选项通常由启动时继承了套接字的进程使用;
(11) SO_USELOOPBACK:
本选项仅用于路由域(AF_ROUTE)套接字,默认设置是打开,相应套接字 将接收在其上发送的任何数据报的一个副本;
(12) SO_REUSEADDR:
TCP先调用close()的一方会进入TIME_WAIT状态,只有设置了SO_REUSEADDR选项的socket,才可以重复绑定使用。server程序总是应该在调用bind之前设置SO_REUSEADDR套接字选项。
这个套接字选项通知内核,如果端口忙,但TCP状态位于 TIME_WAIT ,可以重用端口。如果端口忙,而TCP状态位于其他状态,重用端口时依旧得到一个错误信息,指明"地址已经使用中"。如果你的服务程序停止后想立即重启,而新套接字依旧使用同一端口,此时SO_REUSEADDR 选项非常有用。必须意识到,此时任何非期望数据到达,都可能导致服务程序反应混乱,不过这只是一种可能,事实上很不可能。
3. tcp套接字选项:
(1) TCP_MAXSEG:
本选项允许我们获取或者设置TCP连接的最大分节大小(MSS)。已建立连接返回的是对端使用syn通知的MSS值,否则是未从对端收到MSS情况下使用的默认值;
(2) TCP_NODELAY:
开启本选项将禁止TCP的Nagle算法,默认情况下Nagle算法是启动的;关于Nagle算法,单独总结一篇;
通用套接字选项和TCP套接字选项的更多相关文章
- TCP套接字端口复用SO_REUSEADDR
下面建立的套接字都是tcp套接字 1.进程创建监听套接字socket1,邦定一个指定端口,并接受了若干连接.那么进程创建另外一个套接口socket2,并试图邦定同一个端口时候,bind错误返回“Add ...
- TCP套接字选项SO_LINGER与TCP_LINGER2
概述 本文对两个LINGER相关的套接字选项进行源码层面的分析,以更明确其各自的作用和区别: man page SO_LINGER,该选项是socket层面的选项,通过struct linger结构来 ...
- TCP套接字编程模型及实例
摘要: 本文讲述了TCP套接字编程模块,包括服务器端的创建套接字.绑定.监听.接受.读/写.终止连接,客户端的创建套接字.连接.读/写.终止连接.先给出实例,进而结合代码分析. PS:本文权当 ...
- Linux系统C语言socket tcp套接字编程
1.套接字的地址结构: typedef uint32_t in_addr_t; //32位无符号整数,用于表示网络地址 struct in_addr{ in_addr_t s_addr; //32位 ...
- UNIX网络编程——基本TCP套接字编程
一.基于TCP协议的网络程序 下图是基于TCP协议的客户端/服务器程序的一般流程: 服务器调用socket().bind().listen()完成初始化后,调用accept()阻塞等待,处于监听端口的 ...
- <网络编程>基本TCP套接字编程
tcp提供了可靠传输,当tcp向另一端发送数据的时候,要求对端返回一个确认.如果没有接收到确认,tcp就重传数据并且等待更长时间,数次重传失败后,tcp才放弃. 建立一个tcp连接会发生如下事情: 服 ...
- Java套接字Socket编程--TCP参数
在Java的Socket中,主要包含了以下可设置的TCP参数. 属性 说明 默认值 SO_TIMEOUT 对ServerSocket来说表示等待连接的最长空等待时间; 对Socket来说表示读数据最长 ...
- LINUX TCP套接字详细配置
提高服务器的负载能力,是一个永恒的话题.在一台服务器CPU和内存资源额定有限的情况下,最大的压榨服务器的性能,是最终的目的.要提高 Linux系统下的负载能力,可以先启用Apache的Worker模式 ...
- UNP学习笔记1——基本TCP套接字编程
1 套接字地址结构 大多数套接字函数都需要一个指向套接字地址结构的指针作为参数.每个协议族都定义了自己的套接字结构.这些套接字的结构以sockaddr_开头,以每个协议族唯一的后缀名结尾. 1.1 I ...
随机推荐
- request 域 个人理解
1.转发到另一个servlet时候 地址还是输入当前的servlet 2.通过服务器转到另一个servlet时候 另一个servlet是最终接收端 端到端模式 相当于这个东西是发给自己的 只不过经过多 ...
- bzoj2257[POI2011]Programming Contest
首先可以费用流建图,左边一堆点表示人,右边一堆点表示题,源点向每个人连floor(t/r)条边,费用依次为r,2r,3r….然后写了一个卡不过去,动态加边也卡不过去,然后我想:这里一定有一些不为人知的 ...
- CentOS 文本搜索grep
grep 用于在文本中执行关键词搜索, 用法: grep [选项]... PATTERN [FILE]... [root@bigdata-senior01 ~]# grep "ftp&quo ...
- React router 4 获取路由参数,跨页面参数
1. match通过路径 <Route path="/path/:name" component={example} /> 路由组件内获取参数使用 this.props ...
- LibreOJ #6190. 序列查询(线段树+剪枝)
莫队貌似是过不了的,这题是我没见过的科技... 首先区间按右端点排序,然后一个扫描线,扫到某个区间右端点时候计算答案,线段树上节点的信息并不需要明确定义,我们只要求线段树做到当前扫到now时,查询[L ...
- 搞笑的代码 ( funny )
搞笑的代码 ( funny ) 在OI界存在着一位传奇选手——QQ,他总是以风格迥异的搞笑代码受世人围观 某次某道题目的输入是一个排列,他使用了以下伪代码来生成数据 while 序列长度<n d ...
- 【贪心】【CF3D】 Least Cost Bracket Sequence
传送门 Description 给一个序列,序列里面会有左括号.问号.右括号.对于一个\(?\)而言,可以将其替换为一个\((\),也可以替换成一个\()\),但是都有相应的代价.问:如何替换使得代价 ...
- 【并查集】【P1525】关押罪犯
传送门 Description Input Output Sample Input Sample Output Hint Solution 非常显然的并查集题目,在本题中,对于每个罪犯i,维护两个信息 ...
- hdu 5616
Jam's balance Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Tot ...
- Wand FZU - 2282 全错位重排
N wizards are attending a meeting. Everyone has his own magic wand. N magic wands was put in a line, ...