最新消息:

Linux Socket 学习笔记21-带外数据1

Linux admin 3045浏览 0评论
  • 带外数据的概念

套接口API提供了一种机制,它可以让一束数据加速从常规数据之前到达接收方,这束数据就是所谓的带外数据。

  • 带外数据的必要性

有时候我们需要处理紧急情况,这时候就需要用带外数据来实现,例如客户端想要终止正在发送的一段数据,服务器的程序还没有来的及读取这段程序,这时客户端需要发送带外数据来取消数据的发送,这样就能减少服务器的负担。

  • 发送和接收带外数据

在发送带外数据时需要把函数send的flags参数设置为MSG_OOB。

接收带外数据分为两种情况:

  1. 单独读取带外数据
  2. 与带内数据一起读

如果采用分开读取的方式,那么带内数据到达时必须通知接收进程,同样,接收带内数据要把函数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;">&amp;</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

您必须 登录 才能发表评论!