《UNIX环境高级编程》笔记--套接字选项,带外数据

1.套接字选项

套接字机制提供两个套接字选项接口来控制套接字行为。一个接口用来设置选项,另一个接口允许查询一个选项的状态。可以
获取或设置三种选项:
1.通用选项,工作在所有套接字类型上。
2.在套接字层次管理的选项,但是依赖于下层协议的支持。
3.特定于某协议的选项,为每个协议独立。
SUS仅定义了套接字层的选项。(1和2)
可以采用setsockopt函数来设置套接字选项。
#include<sys/socket.h>
int setsockopt(int sockfd, int level, int option, const void *val, socklen_t len);//成功则返回0,出错则返回-1.
参数level标识了option应用的协议。如果option是通用的套接字选项,level设置成SOL_SOCKET.否则,level设置成控制这个option
的协议号。例如,对于TCP选项,这是IPPROTO_TCP,对于IP选项,这是IPPROTO_IP。
下表总结了SUS所定义的通用套接字层的option。
《UNIX环境高级编程》笔记--套接字选项,带外数据_第1张图片
参数val根据选项的不同指向一个数据结构或者一个整数。

可以使用getsocketopt函数来发现选项的当前值。
#include<sys/socket.h>
int getsockopt(int sockfd, int level, int option, void *restrict val, socklen_t *restrict lenp); //若成功则返回0,出错则返回-1
lenp是一个指向整数的指针。在调用getsockopt之前,设置该整数为复制选项缓冲区的大小。如果实际的尺寸大于此值,选项
会被截断而不报错;如果实际尺寸正好等于小于此值,那么返回时将此值更新为实际大小。

2.带外数据

带外数据(out of band data)是一些通信协议所支持的可选特征。允许更高优先级的数据比普通数据有限传输。即时传输队列
中已经有数据,带外数据先行传输。TCP支持带外数据,UDP不支持。
TCP将带外数据称为紧急数据。TCP仅支持一个字节的紧急数据。为了产生紧急数据,在三个send函数中任何一个指定标志
MSG_OOB。如果带MSG_OOB标志传输字节超过一个时,最后一个字节被看做紧急数据字节。
如果采用套接字选项SO_OOBINLINE,那么可以在普通数据中接受紧急数据。为帮助判断是否接受到紧急标记,可以使用
sockatmark函数。
#include<sys/socket.h>
int sockatmark(int sockfd); //若在标记处则返回1,若没有则返回0,出错则返回-1.
当带外数据出现在套接字读取队列时,select函数会返回一个文件描述符,并且拥有一个异常状态挂起。可以在普通数据
流上接收紧急数据,或者在某个recv函数中采用MSG_OOB标志在其他队列数据之前接收紧急数据。TCP队列仅有一个字节的
紧急数据,如果在接收当前的紧急数据字节之前又有新的紧急数据到来,那么当前的字节会被丢弃。

你可能感兴趣的:(《UNIX环境高级编程》笔记--套接字选项,带外数据)