当前位置: 首页 > 服务器&&网络编程 > 正文

Linux 网络编程 套接字选项

前言

套接字有很多的选项,可以帮助我们定制化很多的功能。这里就来小结一些通用的套接字的选项。

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

仅仅在路由域套接字。默认打开,相应套接字将接收其上发送的任何数据副本。

 

本文固定链接: http://zmrlinux.com/2016/03/12/linux-%e7%bd%91%e7%bb%9c%e7%bc%96%e7%a8%8b-%e5%a5%97%e6%8e%a5%e5%ad%97%e9%80%89%e9%a1%b9/ | Kernel & Me

该日志由 root 于2016年03月12日发表在 服务器&&网络编程 分类下, 你可以发表评论,并在保留原文地址及作者的情况下引用到你的网站或博客。
原创文章转载请注明: Linux 网络编程 套接字选项 | Kernel & Me