前言
套接字有很多的选项,可以帮助我们定制化很多的功能。这里就来小结一些通用的套接字的选项。
getsockopt && setsockopt 函数
#include <sys/types.h>
#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 级别
@optval 指向一个变量的指针从中选择我们要设置的新值
套接字选项的两个基本类型
@启用或禁用某个特性的二元选项
@取得并返回我们可以设置或检查的特定值的选项
套接字选项
不论时TCP ,UDP SCTP 这些协议的套接字都很多,甚至有些套接字虽然有,但是并没有提供实现的,都是存在这种情况的。这里我仅仅小结下,几种通用的套接字选项。
SO_BROADCAST
本选项开启或禁止进程发送广播消息的能力,这支持数据报套接字可以使用,并且还必须在支持广播消息的网络上。
SO_DEBUG
这个选项只支持TCP套接字选项,内核将为TCP在该套接字发送和接收缓冲区所有分组保留详细跟踪信息。
SO_DONTROUTE
本选项将规定外出的分组将绕过底层协议的正常路由机制。
SO_ERROR
这个就是一个错误检测的方法,当有错误发生时,立刻将SO_error设置成标准错误中的一个,内核就可以使用下面两种方法来通知错误:
@select 返回
@信号驱动模型,发送信号
SO_KEEPALIVE
给一个套接字设置这个选项后,在大约两个小时对端没有反应后,就会发送一个一个保活探测分节,这是一个TCP必须回复的分节,接收包括以下的一些东西:
@ACK :正常,一切OK 。
@RST : 对端已经崩溃返回错误结束。
@没有收到任何相应:接着会在后序另外发送8个探测分节,两两相隔75秒,在第一个TCP发出11.25分钟后直接结束。
@这个选项总结下:一般由服务器使用,在于探测客户端是否存在是否调线崩溃。它的等待时间由内核参数决定,可以修改。
SO_LINGER
这个选项指定close 关闭套接字的时候使用一些动作。
下面是一些TCP的一些检测问题
本端TCP 对端进程崩溃 对端主机崩溃 对端主机不可达
发送 可以检测,信号结束 超时结束 不可达结束
接收 当作EOF 读入结束 停止接收数据 停止接收数据
保活等待 IO复用可以检测问题 2小时检测活性 9个保活探测分节
未保活等待 IO复用可以检测问题 无 无
这个选项可以设置一个结构体
struct linger{
int l_onoff;
int l_linger;
};
这个选项的核心目的:在本端发送完所有的数据后,需要关闭套接字了,但是如何确定对端是否收到了 所有的数据,如果接收了一部分,但是崩溃了,本端也关闭了套接字,不能发现这个问题。怎么办?
其实最好的方法是在应用层发送一个ACK 当然也可以使用我们的这个方法。
函数 效果 缓冲区
shutdown SHUT_RD 不再接收,发送完成后结束 对缓冲区无影响 (禁用)
shutdowm SHUT_WR 不再发送, 接收范成后结束 对缓冲区无影响 (禁用)
close l_onoff = 0 不再做请求,将发送缓冲区发送完毕 接收区接收被丢弃
close l_onoff = 1 不再做任何请求,引用计数为0直接发RST 丢掉所有缓冲区数据
l_linger = 0
close l_onoff = 1 不再做任何请求,发送缓冲区的数据被发送,接收缓冲区被丢弃
L_onoff != 0 正常终止。
SO_OOBINLINE
本选项开始时,外带数据将被留在正确的输入队列中。在线残留。
SO_RCVBUF && SO_SNDBUF
目的:改变缓冲区大小
套接字 设置时机
SO_RCVBUF SO_SNDBUF 对与客户:connect 之前 对与服务器:listen 之前
原因: 这个缓冲区的大小是在三路握手,SYN 时相互通知的
大小设置:缓冲区的大小至少要设置成MSS 值的四倍,历史原因,全双工通道
带宽:相应两个端点之间最慢链路值,可以说是已知的。
SO_RCVLOWAT && SO_SNDLOWAT
用来设置套接字的低水位,常识不解释
SO_RECVTIMEO && SO_SENDTIMEO
我们可以设置一个超时值。
SO_REUSEADDR && SO_REUSEPORT
SO_REUSEADDR 的使用有以下的四种基本动作
1.允许启动一个监听服务器并捆绑种众所周知的端口,即使以前建立的端口正在使用它也可以。
2.允许一个端口启动多个服务器实例,HTTP很常见
3.允许完全重复捆绑,仅仅支持UDP,广播,多播使用
4.允许单个进程捆绑到同一个端口的多个套接子,但是每次IP不同
SO_REUSEPORT
1.允许完全重复捆绑,必须都有这个选项
2.如果是一个多播地址和SO_REUSEADDR 等效
SO_TYPE
本选项返回套接字类型,例如返回SOCK_STREAM
SO_USELOOPBACK
仅仅在路由域套接字。默认打开,相应套接字将接收其上发送的任何数据副本。
本文概要介绍了套接字选项的概念及其在不同协议(如TCP、UDP、SCTP)中的应用,着重讨论了SO_BROADCAST、SO_DEBUG、SO_DONTROUTE等关键选项的用途与工作原理。此外,文章还阐述了SO_KEEPALIVE、SO_LINGER、SO_OOBINLINE、SO_RCVBUF、SO_SNDBUF等选项在连接维护、数据传输和缓冲区管理等方面的重要作用,提供了实用的配置指导。

被折叠的 条评论
为什么被折叠?



