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套接字选项的更多相关文章

  1. TCP套接字端口复用SO_REUSEADDR

    下面建立的套接字都是tcp套接字 1.进程创建监听套接字socket1,邦定一个指定端口,并接受了若干连接.那么进程创建另外一个套接口socket2,并试图邦定同一个端口时候,bind错误返回“Add ...

  2. TCP套接字选项SO_LINGER与TCP_LINGER2

    概述 本文对两个LINGER相关的套接字选项进行源码层面的分析,以更明确其各自的作用和区别: man page SO_LINGER,该选项是socket层面的选项,通过struct linger结构来 ...

  3. TCP套接字编程模型及实例

    摘要:     本文讲述了TCP套接字编程模块,包括服务器端的创建套接字.绑定.监听.接受.读/写.终止连接,客户端的创建套接字.连接.读/写.终止连接.先给出实例,进而结合代码分析. PS:本文权当 ...

  4. Linux系统C语言socket tcp套接字编程

    1.套接字的地址结构: typedef uint32_t in_addr_t; //32位无符号整数,用于表示网络地址 struct in_addr{ in_addr_t s_addr; //32位 ...

  5. UNIX网络编程——基本TCP套接字编程

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

  6. <网络编程>基本TCP套接字编程

    tcp提供了可靠传输,当tcp向另一端发送数据的时候,要求对端返回一个确认.如果没有接收到确认,tcp就重传数据并且等待更长时间,数次重传失败后,tcp才放弃. 建立一个tcp连接会发生如下事情: 服 ...

  7. Java套接字Socket编程--TCP参数

    在Java的Socket中,主要包含了以下可设置的TCP参数. 属性 说明 默认值 SO_TIMEOUT 对ServerSocket来说表示等待连接的最长空等待时间; 对Socket来说表示读数据最长 ...

  8. LINUX TCP套接字详细配置

    提高服务器的负载能力,是一个永恒的话题.在一台服务器CPU和内存资源额定有限的情况下,最大的压榨服务器的性能,是最终的目的.要提高 Linux系统下的负载能力,可以先启用Apache的Worker模式 ...

  9. UNP学习笔记1——基本TCP套接字编程

    1 套接字地址结构 大多数套接字函数都需要一个指向套接字地址结构的指针作为参数.每个协议族都定义了自己的套接字结构.这些套接字的结构以sockaddr_开头,以每个协议族唯一的后缀名结尾. 1.1 I ...

随机推荐

  1. SQL Server的全局变量

    SQL Service中的全部变量不需要用户参与定义,在任何程序均可随时调用.并且全部变量是以@@开头 全局变量名称 描述 @@CONNECTIONS 返回 SQL Server 自上次启动以来尝试的 ...

  2. IOI 98 (POJ 1179)Polygon(区间DP)

    很容易想到枚举第一步切掉的边,然后再计算能够产生的最大值. 联想到区间DP,令dp[i][l][r]为第一步切掉第i条边后从第i个顶点起区间[l,r]能够生成的最大值是多少. 但是状态不好转移,因为操 ...

  3. 【bzoj4641】基因改造 特殊匹配条件的KMP

    题目描述 如果两个长度相等的字符串,如果存在一种字符的一一映射,使得第一个字符串的所有字符经过映射后与第二个字符串相同,那么就称它们“匹配”.现在给出两个串,求第一个字符串所有长度等于第二个字符串的长 ...

  4. 整合常用功能的JS小组件库-v1.0

    function Alex() { //给予video.js的页面滚动到视频元素范围内自动播放/出范围暂停播放-----01 this.video_autoplay = function (box) ...

  5. 生成模型(Generative Model)Vs 判别模型(Discriminative Model)

      概率图分为有向图(bayesian network)与无向图(markov random filed).在概率图上可以建立生成模型或判别模型.有向图多为生成模型,无向图多为判别模型. 判别模型(D ...

  6. ywy_c_asm题

    未知出处 题意: 定义一个无穷长的数列,满足以下性质:$1.X_{2n}=-{X_{n}}$ $2.X_{2n}=(-1)^{(n+1)}*X_{n}$ $3.X_{2n-1}=(-1)^{(n+1) ...

  7. CentOS7搭建 Hadoop + HBase + Zookeeper集群

    摘要: 本文主要介绍搭建Hadoop.HBase.Zookeeper集群环境的搭建 一.基础环境准备 1.下载安装包(均使用当前最新的稳定版本,截止至2017年05月24日) 1)jdk-8u131 ...

  8. Educational Codeforces Round 61 (Rated for Div. 2) D,F题解

    D. Stressful Training 题目链接:https://codeforces.com/contest/1132/problem/D 题意: 有n台电脑,每台电脑都有初始电量ai,也有一个 ...

  9. HTTP的特点?

    (1)HTTP是无连接: 无连接的含义是限制每次连接只处理一个请求.服务器处理完客户的请求,并收到客户的应答后,即断开连接.采用这种方式可以节省传输时间. (2)HTTP是媒体独立的: 这意味着,只要 ...

  10. zoj 2369 Two Cylinders

    zoj 2369 Two Cylinders 链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2369 题意:已知两个无 ...