- 带外数据的概念
套接口API提供了一种机制,它可以让一束数据加速从常规数据之前到达接收方,这束数据就是所谓的带外数据。
- 带外数据的必要性
有时候我们需要处理紧急情况,这时候就需要用带外数据来实现,例如客户端想要终止正在发送的一段数据,服务器的程序还没有来的及读取这段程序,这时客户端需要发送带外数据来取消数据的发送,这样就能减少服务器的负担。
- 发送和接收带外数据
在发送带外数据时需要把函数send的flags参数设置为MSG_OOB。
接收带外数据分为两种情况:
- 单独读取带外数据
- 与带内数据一起读
如果采用分开读取的方式,那么带内数据到达时必须通知接收进程,同样,接收带内数据要把函数recv的flags参数设置为MSG_OOB。
下面是实现的部分代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
<span style="color: #808080; font-style: italic;">/* * SIGURG signal handler : */</span> <span style="color: #993333;">static</span> <span style="color: #993333;">void</span> sigurg<span style="color: #009900;">(</span><span style="color: #993333;">int</span> signo<span style="color: #009900;">)</span> <span style="color: #009900;">{</span> <span style="color: #993333;">int</span> n<span style="color: #339933;">;</span> <span style="color: #993333;">char</span> buf<span style="color: #009900;">[</span><span style="color: #0000dd;">256</span><span style="color: #009900;">]</span><span style="color: #339933;">;</span> n <span style="color: #339933;">=</span> recv<span style="color: #009900;">(</span>s<span style="color: #339933;">,</span>buf<span style="color: #339933;">,</span><span style="color: #993333;">sizeof</span> buf<span style="color: #339933;">,</span>MSG_OOB<span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #b1b100;">if</span> <span style="color: #009900;">(</span> n <span style="color: #339933;">&</span>lt<span style="color: #339933;">;</span> <span style="color: #0000dd;">0</span> <span style="color: #009900;">)</span> bail<span style="color: #009900;">(</span><span style="color: #ff0000;">"recv(2)"</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> buf<span style="color: #009900;">[</span>n<span style="color: #009900;">]</span> <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> <span style="color: #000066;">printf</span><span style="color: #009900;">(</span><span style="color: #ff0000;">"URG '%s' (%d)<span style="color: #000099; font-weight: bold;">n</span>"</span><span style="color: #339933;">,</span> buf<span style="color: #339933;">,</span>n<span style="color: #009900;">)</span><span style="color: #339933;">;</span> signal<span style="color: #009900;">(</span>SIGURG<span style="color: #339933;">,</span>sigurg<span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #009900;">}</span> <span style="color: #993333;">int</span> main<span style="color: #009900;">(</span><span style="color: #993333;">int</span> argc<span style="color: #339933;">,</span><span style="color: #993333;">char</span> <span style="color: #339933;">**</span>argv<span style="color: #009900;">)</span> <span style="color: #009900;">{</span> <span style="color: #993333;">int</span> z<span style="color: #339933;">;</span> <span style="color: #808080; font-style: italic;">/* Status */</span> <span style="color: #993333;">char</span> buf<span style="color: #009900;">[</span><span style="color: #0000dd;">256</span><span style="color: #009900;">]</span><span style="color: #339933;">;</span> <span style="color: #808080; font-style: italic;">/* * 。。。 *建立连接等等。。 */</span> <span style="color: #666666; font-style: italic;">//取得套接口的所有权</span> z <span style="color: #339933;">=</span> fcntl<span style="color: #009900;">(</span>s<span style="color: #339933;">,</span>F_SETOWN<span style="color: #339933;">,</span>getpid<span style="color: #009900;">(</span><span style="color: #009900;">)</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #b1b100;">if</span> <span style="color: #009900;">(</span> z <span style="color: #339933;">==</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span> <span style="color: #009900;">)</span> bail<span style="color: #009900;">(</span><span style="color: #ff0000;">"fcntl(2)"</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #808080; font-style: italic;">/* * Catch SIGURG : */</span> signal<span style="color: #009900;">(</span>SIGURG<span style="color: #339933;">,</span>sigurg<span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #b1b100;">for</span> <span style="color: #009900;">(</span><span style="color: #339933;">;;</span><span style="color: #009900;">)</span> <span style="color: #009900;">{</span> z <span style="color: #339933;">=</span> recv<span style="color: #009900;">(</span>s<span style="color: #339933;">,</span>buf<span style="color: #339933;">,</span><span style="color: #993333;">sizeof</span> buf<span style="color: #339933;">,</span><span style="color: #0000dd;">0</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #b1b100;">if</span> <span style="color: #009900;">(</span> z <span style="color: #339933;">==</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span> <span style="color: #009900;">)</span> bail<span style="color: #009900;">(</span><span style="color: #ff0000;">"recv(2)"</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #b1b100;">if</span> <span style="color: #009900;">(</span> z <span style="color: #339933;">==</span> <span style="color: #0000dd;">0</span> <span style="color: #009900;">)</span> <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span> buf<span style="color: #009900;">[</span>z<span style="color: #009900;">]</span> <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> <span style="color: #000066;">printf</span><span style="color: #009900;">(</span><span style="color: #ff0000;">"rcv '%s' (%d)<span style="color: #000099; font-weight: bold;">n</span>"</span><span style="color: #339933;">,</span> buf<span style="color: #339933;">,</span> z<span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #009900;">}</span> close<span style="color: #009900;">(</span>s<span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> <span style="color: #009900;">}</span> |
这里要注意,其实紧急数据在TCP中的处理和普通的带外数据是有所区别的,这里有一个紧急指针的问题,具体的看书。
转载请注明:爱开源 » Linux Socket 学习笔记21-带外数据1