您的位置:首页 > 理论基础 > 计算机网络

UNIX网络编程卷1:套接字联网-第7章:套接字选项

2017-07-19 13:50 218 查看

1.套接字选项是干嘛的

其实理解个大概就行,套接字选项可以看成就是套接字属性,通过设置套接字选项可以开启或关闭一些功能。可以理解为对套接字的某些细化操作已经被封装,他的接口

就是套接字选项,我们通过设置套接字选项来细化控制套接字的某些属性和功能。针对某些特定协议,可能有特定的套接字,所以套接字选项可以分类为通用、ipv4、

ipv6、tcp、sctp等

2.常见的套接字选项详解

此处只列举我认为常见的,具体套接字选项可以查看相关手册

SO_KEEPALIVE套接字选项

之前我有篇博文提到过,tcp探测连接的两种方式,其中有一种就是设置tcp套接字选项SO_KEEPALIVE选项,具体情况参见我之前的讲解。

SO_RECVBUF和SO_SNDBUF套接字选项

每个套接字都有一个发送缓冲区和一个接收缓冲区。这两个套接字选项允许我们改变这两个缓冲区的默认大小。

SO_LINGER套接字选项

结合shutdown和close函数使用,可以精确对套接字发送和接收缓冲区中残余数据的处理和关闭的具体流程。(很多种小情况,读者先需要整体过一遍,但肯定是无法硬记下来,知道是干什么的,然后在需要时去查询资料及可)

SO_REUSEADDR和SO_REUSEPORT套接字选项

有4个不同的功用:

 1.允许启动一个监听服务器并捆绑其众说周知的端口,即使以前建立的将该端口作为他们的本地端口的连接仍然存在

所有TCP服务器都应该指定本套接字选项,以防止一下情况

    a)启动一个监听服务器

    b)连接请求到达,派生一个子进程来处理这个客户

    c)监听服务器终止,但子进程继续为现有连接上的客户提供服务

    d )重启动监听服务器

在默认情况下,如果没有设定这个套接字选项,服务器重启(调用bind时会返回错误)。(这种情况最常见)

2.SO_REUSEADDR允许在同一端口启动同一服务的多个实例,只要每个实例捆绑一个不同的本地ip地址即可

3.略

4.略

3.怎么获取和设置套接字选项

fcntl函数解析

#include<fcntl.h>
int fcntl(int fd,int cmd,.../*int arg*/);
//返回:若成功则取决于cmd,若出错则为-1fcntl的作用:fcntl()用来操作文件描述符的一些特性。fcntl 不仅可以施加建议性锁,还可以施加强制锁。同时,fcntl还能对文件的某一记录进行上锁,也就是记录锁。
fd:参数fd代表欲设置的文件描述符

cmd:数cmd代表打算操作的指令

fcntl函数提供的网络编程相关特性:

1.非阻塞式I/O

2.信号驱动式I/O

3.F_SETOWN命令允许我们指定用于接收SIGIO和SIGURG信号的套接字属主

每种描述符(包括套接字描述符)都有一组F_GETFL命令获取或由F_SETFL命令设置的文件标志,其中:

O_NONBLOCK------------非阻塞式I/O

O_ASYNC-------------------信号驱动式I/O

重点:设置某个文件状态表示的唯一正确方法:先取得当前标志,与新标志逻辑或后再设置标志

开启非阻塞式I/O的代码实例:

int flags;
if((flags = fcntl(fd,F_GETFL,0)) < 0)
err_sys("F_GETFL error");
flags |= O_NONBLOCK;
/*如果要关闭非阻塞,flags &= ~O_NONBLOCK;*/
if(flags = fcntl(fd,F_SETFL,flags) <0)
err_sys("F_SETFL error");

posix推荐fcntl方法
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: