⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 96.htm

📁 unix高级编程原吗
💻 HTM
字号:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>CTerm非常精华下载</title>
</head>
<body bgcolor="#FFFFFF">
<table border="0" width="100%" cellspacing="0" cellpadding="0" height="577">
<tr><td width="32%" rowspan="3" height="123"><img src="DDl_back.jpg" width="300" height="129" alt="DDl_back.jpg"></td><td width="30%" background="DDl_back2.jpg" height="35"><p align="center"><a href="http://apue.dhs.org"><font face="黑体"><big><big>123</big></big></font></a></td></tr>
<tr>
<td width="68%" background="DDl_back2.jpg" height="44"><big><big><font face="黑体"><p align="center">               ● UNIX网络编程                       (BM: clown)                </font></big></big></td></tr>
<tr>
<td width="68%" height="44" bgcolor="#000000"><font face="黑体"><big><big><p   align="center"></big></big><a href="http://cterm.163.net"><img src="banner.gif" width="400" height="60" alt="banner.gif"border="0"></a></font></td>
</tr>
<tr><td width="100%" colspan="2" height="100" align="center" valign="top"><br><p align="center">[<a href="index.htm">回到开始</a>][<a href="54.htm">上一层</a>][<a href="97.htm">下一篇</a>]
<hr><p align="left"><small>发信人: clown (梧桐叶), 信区: UNP <br>

标  题: unp第二十一章学习体会 <br>

发信站: UNIX编程 (2001年10月12日20:17:10 星期五), 站内信件 <br>

  <br>

本章介绍的是带外数据(out-of-band data),我对带外数据 <br>

没有什么了解,只是接触过紧急模式,幸好书上认为这两个概念 <br>

认为是等同的。但是在TCP/IP Illustrated中又说,“许多实现 <br>

不正确地称TCP的紧急模式为带外数据”,我也不太明白到底真正 <br>

的带外数据是什么呢? <br>

  <br>

在这里,我暂且将紧急模式认为是带外数据,下面的介绍就以紧急 <br>

模式为例。 <br>

  <br>

1)概念 <br>

在TCP头部,有一个紧急标志,发送方用它来通知接收方具有某种 <br>

方式的“紧急数据”已经放置在普通的数据流中,由接收方决定如何 <br>

处理。与该标志相对应,有一个紧急指针(与序列号配合计算紧急偏 <br>

移),用来指示紧急数据的位置,一般该指针有一个比用MSG_OOB标志 <br>

写入的数据多一个字节的序列号。只要接收方当前读取位置到紧急数 <br>

据指针之间有数据存在,就认为应用程序处于“紧急模式”。 <br>

  <br>

2)紧急模式的特点 <br>

主要是在接收方TCP缓冲区没有空间的情况下,紧急通知也会发送到对方。 <br>



另外,紧急指针总是指向刚好越过紧急数据的后一个字节的地方。当使用 <br>

recv函数读去接收套接口内容时,总是会停留在紧急指针处。 <br>

  <br>

3)紧急数据的发送和接收 <br>

发送的时候,只需要将send函数的flag标志设置为MSG_OOB。 <br>

接收相对来说要复杂一些,有三种不同的方法来接收紧急数据: <br>

  <br>

1。使用SIGURG信号接收紧急数据 <br>

首先建立信号处理函数,然后使用fcntl设置套接口的属主,这样当紧急 <br>

数据到达时,套接口的属主就会收到SIGURG信号,然后使用recv函数,将 <br>

flag标志设置为MSG_OOB就可以了。 <br>

  <br>

2。使用select函数 <br>

当带外数据到达时,select会返回一个异常,在异常条件中调用recv函数 <br>

就可以接收紧急数据了。 <br>

  <br>

3。使用sockatmark函数 <br>

当紧急数据到达时,该函数返回1。虽然Linux不支持该函数,但是使用 <br>

ioctl的SIOCATMARK选项可以很简单地实现。 <br>

  <br>

有一个要注意的问题是,当由紧急指针指向的实际数据字节到达接收者的 <br>

tcp缓冲区时,这个数据字节并没有存放在套接口缓冲区,而是被放到这个 <br>



连接的单独的1字节带外缓冲区。进程从这个特别的1字节缓冲区读取数据 <br>

的仅有办法是调用recv, recvfrom或者recvmsg并且指定MSG_OOB标志。 <br>

然而如果设置了SO_OOBONLINE套接口选项,那么紧急指针指向的实际数据 <br>

就保存在套接口缓冲区中,进程不能指定MSG_OOB选项。 <br>

  <br>

书中最后介绍了一个使用紧急模式来实现客户-服务器心博函数例子,觉得 <br>

很实用。 <br>

  <br>

下面有一个测试紧急模式的例子: <br>

客户发送了四个数据报,其中有两个时紧急模式。通过tcpdum可以明显地看到。 <br>

服务器端的结果出人意料,当recv的时候,一次就将所有的数据全部接收了, <br>

但是显示的缓冲区数据确只指示到第一个紧急指针的位置,然后就此一个 <br>

紧急模式标志,接着再recv的时候程序就退出了。 <br>

  <br>

  <br>

  <br>

-- <br>

易朽的是生命,似那转瞬即谢的花朵;然而永存的,是对未来的渴望, <br>

是那生生世世传递下来的,不朽的,生的激情。每一朵勇敢开放的花, <br>

都是一个死亡唇边的微笑。 <br>

※ 修改:·clown 於 10月12日20:21:54 修改本文·[FROM: 211.69.205.23] <br>

※ 来源:·UNIX编程 www.tiaozhan.com/unixbbs/·[FROM: 211.69.205.23] <br>

</small><hr>
<p align="center">[<a href="index.htm">回到开始</a>][<a href="54.htm">上一层</a>][<a href="97.htm">下一篇</a>]
<p align="center"><a href="http://cterm.163.net">欢迎访问Cterm主页</a></p>
</table>
</body>
</html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -