博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
网络IPC:套接字之带外数据
阅读量:5334 次
发布时间:2019-06-15

本文共 1128 字,大约阅读时间需要 3 分钟。

带外数据(Out-of-band data)是一些通信协议所支持的可选特征,允许更高优先级的数据比普通数据优先传输。即使传输队列已经有数据,带外数据先行传输TCP支持带外数据,但是UDP不支持。套接字接口对带外数据的支持,很大程度受TCP带外数据具体实现的影响。

TCP将带外数据称为“紧急”数据(“urgent”data)。TCP仅支持一个字节的紧急数据,但是允许紧急数据在普通数据传递机制数据流之外传输为了产生紧急数据,在三个send函数中任何一个指定标志MSG_OOB。如果带MSG_OOB标志传输字节超过一个时,最后一个字节被看作紧急数据字节。

如果安排发生套接字信号,当接收到紧急数据时,那么发送信号SIGURG。在和中BSD异步I/O部分,可以看到在fcntl中使用F_SETOWN命令来设置一个套接字的所有权。如果fcntl中第三个参数为正值,那么指定了进程ID;如果为非-1的负值,那么(该负值的绝对值)代表了进程组ID。因此,通过调用以下函数,可以安排进程接收一个套接字信号。

fcntl(sockfd, F_SETOWN, pid);

F_GETOWN命令可以用来获得当前套接字所有权。对于F_SETOWN命令,一个负值代表一个进程组ID,一个正值代表进程ID。因此,调用

owner = fcntl(sockfd, F_GETOWN, 0);

返回值owner,如果owner为正值,则owner等于配置为接受套接字信号的进程ID;如果owner为负值,则其绝对值为接受套接字信号的进程组ID。

TCP支持紧急标记(urgent mark)的概念:在普通数据流中紧急数据所在的位置。如果采用套接字选项SO_OOBINLINE,那么可以在普通数据中接收紧急数据。为帮助判断是否接收到紧急标记,可以使用函数sockatmark。

#include 
int sockatmark(int sockfd);返回值:若在标记出则返回1,若没有在标记出则返回0,出错则返回-1

当带外数据出现在套接字读取队列时,select函数()会返回一个文件描述符并且拥有一个异常状态挂起。可以在普通数据流上接受紧急数据,或者在某个recv函数中采用MSG_OOB标志在其他队列数据之前接收紧急数据。TCP队列仅有一个字节的紧急数据,如果在接收当前的紧急数据字节之前又有新的紧急数据到来,那么当前的字节会被丢弃。

本篇博文内容摘自《UNIX环境高级编程》(第二版),仅作个人学习记录所用。关于本书可参考:

转载于:https://www.cnblogs.com/nufangrensheng/p/3567692.html

你可能感兴趣的文章
2018年长沙理工大学第十三届程序设计竞赛 I 连续区间的最大公约数
查看>>
AcWing 246. 区间最大公约数
查看>>
算法笔记--线性基求交模板
查看>>
BZOJ 2154: Crash的数字表格
查看>>
The 2019 Asia Nanchang First Round Online Programming Contest The Nth Item
查看>>
BZOJ1413 [ZJOI2009]取石子游戏
查看>>
「模拟8.21」虎
查看>>
「模拟8.23」阴阳 DP
查看>>
「模拟8.21」山洞(矩阵优化DP)
查看>>
「模拟8.29」chinese(性质)·physics·chemistry(概率期望)
查看>>
「csp-s模拟测试(9.18)」Set·Read·Race
查看>>
csp-s模拟测试「9.14」A·B·C(三分,贪心)
查看>>
可爱精灵宝贝(贪心,搜索)
查看>>
引子(模拟)
查看>>
「模拟8.17」star way to heaven(并查集,最小生成树)
查看>>
飞(fly)(数学推导,liu_runda的神题)
查看>>
「模拟8.18」字符串(卡特兰数)·乌鸦喝水(树状数组,二分)·所驼门王的宝藏(tarjan,拓扑)...
查看>>
「模拟8.13」任(liu_runda的神题,性质分析)
查看>>
「模拟8.23」one递推,约瑟夫
查看>>
「模拟8.19 A嚎叫..(set) B主仆..(DFS) C征程..(DP+堆优化)」
查看>>