Linux 之 网络编程之套接字选项

时间:2022-12-18 00:23:57

SOL_SOCKET协议族选项

获取和设置套接字选项
SO_KEEPALIVE选项
SO_LINGER选项
SO_RCVBUF和SO_SNDBUF选项
SO_RCVLOWAT和SO_SNDLOWAT选项
SO_RCVTIMEO和SO_SNDTIMEO选项
SO_REUSEADDR选项

获取和设置套接字选项

getsockopt()函数和setsockopt()函数原型:
#include <sys/socket.h>
int getsockopt(int s,int level,int optname,void* optval.socklen_t* optlen);
int setsockopt(int s,int level,int optname,void* optval.socklen_t optlen);

按照参数选项界别level值的不同,套接字选项可以分为3大类:
通用套接选项:level的值为SOL_SOCKET
IP选项:level的值为IPPROTO_IP
TCP选项:level的值为IPPROTO_TCP

SO_KEEPALIVE选项

SO_KEEPALIVE保持连接选项,2小时没有数据交互,发送探测报文,有三种回应:
回应一个ACK报文
回应一个RST报文
没有任何回应

SO_KEEPALIVE使用方法:
int optval =1;
setsockopt(sockfd,SOL_SOCKET,SO_KEEPALIVE,&optval,sizeof(optval));

SO_LINGER缓冲区处理方式选项,它的操作通过一个结构体进行:
struct linger{
int l_onoff; //开启(非0)还是关闭(0)该选项
int l_linger; //滞留时间
};

SO_LINGER选项使用方法有三种:
l_onoff等于0,此时SO_LINGER选项不起作用
l_onoff不为0,l_linger为0
l_onoff不为0,l_linger不为0

SO_LINGER使用方法:
optval.l_onoff =1;
optval.l_linger =60;setsockopt(sockfd,SOL_SOCKET,SO_LINGER,&optval,sizeof(optval));

SO_RCVBUF和SO_SNDBUF选项

SO_RCVBUF和SO_SNDBUF缓冲区大小选项:
设置TCP/UDP连接的接收/发送缓冲区的含义
在connect()函数调用之前设置

SO_RCVTIMEO和SO_SNDTIMEO选项

SO_RCVTIMEO表示接收超时,SO_SNDTIMEO表示发送超时,设置是通过一个结构体来实现:
struct timeval{
time_t tv_sec;
sseconds_t tv_usec;
};

SO_RCVLOWAT和SO_SNDLOWAT选项

 SO_RCVLOWAT和SO_SNDLOWAT选项表示接收缓冲区和发送缓冲区的低水位标记。

SO_REUSEADDR选项

SO_REUSEADDR地址可重用选项,设置此选项可以使用被处于TIME_WAIT状态的连接占用的socket地址:

int reuse =1;
Setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse));

IPPROTO_TCP和IPPROTO_IP选项

TCP_KEEPALIVE选项
TCP_NODELAY和TCP_CORK选项
IP_TOS选项
IP_TTL选项

TCP_KEEPALIVE选项

TCP_KEEPALIVE用来获取或设置存活探测的时间间隔:

int alivetime = 60;
int fd = socket(AF_INET,SOCK_STREAM,0);
setsockopt(fd,IPPROTO_TCP,TCP_KEEPALIVE,&alivetime,sizoef(alivetime));

TCP_NODELAY和TCP_CORK选项

TCP_NODELAY和TCP_CORK针对Nagle算法,此算法的基本原理如下:
将下分组封装成大的分组再发送
使用延迟确认

TCP_NODELAY选项的作用:
客户端的请求不需要和其他分组合并
TCP_CORK选项的作用
需要等到发送的数据量达到最大是,一次性发送全部数据

IP_TOS选项

服务类型选项:
IPTOS_LOWDELAY:表示最小延迟
IPTOS_RELIABILITY:表示最大可靠性
IPTOS_THROUGHPUT:表示最大吞吐量
IPTOS_LOWCOST:表示最小成本

ioctl()函数

ioctl()函数的命令选项
ioctl()函数的IO请求
ioctl()函数的文件请求
ioctl()函数的网络接口请求
ioctl()函数对ARP高速缓存操作

ioctl()函数的命令选项

ioctl()函数和协议栈交互,主要的交互类型由:
IO
文件
网络接口
路由
ARP

ioctl()函数的IO请求

套接字IO操作的命令请求有6个,第三个参数为整形指针:
SIOCATMARK:查看TCP连接是否有带外数据
SIOCSPGRP和FIOSETOWN:处理套接字的SIGIO和SIGURG信号
SIOCGPGRP和FIOGETOWN:设置接收SIGIO信号的进程ID
SIOCGSTAMP:获取最后一个数据报达到的事件

ioctl()函数的文件请求

文件请求的命令有3个:
FIONBIO:用于设置或清除套接字的非阻塞标志
FIOASYNC:设置或者清除套接字的异步信号
FIONREAD:获得当前套接字接受缓冲区的字节数

ioctl()函数的网络接口请求

获得网络接口的不同参数的不同命令选项:
SIOCGIFADDR和SIOCSIFADDR:获取和设置本地IP地址
SIOCGIFMTU和SIOCSIFMTU:获取和设置MTU
SIOCGIFHWADDR和SIOCSIFHWADDR:获取和设置硬件地址

ioctl()函数对ARP高速缓存操作

ioctl()函数获取ARP高速缓存,有三个命令字:
SIOCDARP:删除高速缓存中的一个记录
SIOCSARP:设置或者修改一个记录
SIOCGARP:获得一个记录

(未完待续……持续更新……)