📄 95.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="96.htm">下一篇</a>]
<hr><p align="left"><small>发信人: clown (梧桐叶), 信区: UNP <br>
标 题: unp第二十章学习体会 <br>
发信站: UNIX编程 (2001年10月10日21:25:23 星期三), 站内信件 <br>
<br>
本章介绍的是高级udp编程,实际上就是在udp套接口中 <br>
完成以下几件事情: <br>
<br>
1)得到接收到的报文的目的ip地址,也就是要知道是本 <br>
地主机的哪块网卡的哪个ip地址收到的该报文。 <br>
<br>
书上介绍的是使用套接口选项IP_RECVDSTADDR和IP_RECVIF, <br>
然后使用recvmsg函数得到这些信息,然而Linux不支持 <br>
这两个选项,我通过测试,发现可以使用getsockname得到 <br>
udp报文的目的ip和端口,而具体是哪个接口接收的该报文 <br>
没有简便的方法得到。 <br>
<br>
2)给udp应用程序增加可靠性 <br>
主要就超时重传(处理数据报丢失)和给报文添加一个序列 <br>
号(验证数据的有效性)。实现方法就是在udp报文前面添加 <br>
两个字段:序列号字段和服务器返回的时间戳。实际应用中, <br>
服务器返回的时间戳是客户的发送报文中填写的,用于客户 <br>
计算数据报的往返时间。 <br>
<br>
<br>
关于超时重传时间的计算和详细的使用可以看看书上的例子, <br>
这些都比较简单,就不再介绍了。 <br>
<br>
3)并发udp服务器 <br>
以前写的udp服务器的例子都是迭代执行的,书上分两种情况 <br>
介绍了如何使用并发udp服务器。 <br>
<br>
首先,如果udp服务器不由inetd启动,也就是说是一个单独的 <br>
服务器,那么在数据报到达,recvfrom返回以后,fork一个子 <br>
进程。父进程继续调用recvfrom,而子进程则创建一个新的套 <br>
接口,然后bind一个临时端口,然后在这个新的套接口上向客 <br>
户发送数据。 <br>
<br>
其次,如果udp服务器由inetd启动,因为在inetd.conf中udp服务 <br>
一般指定为wait(为什么使用wait见书本Page284),这就导致 <br>
inetd停止在该套接口上,直到inetd的子进程中指,也就是该udp <br>
服务器终止。因此在inetd中,有数据到达以后,一般会fork一个 <br>
子进程来执行该udp服务器程序,这时udp服务器程序应该首先接收 <br>
该数据报,然后fork一个子进程,父进程exit,这样inetd就能够 <br>
继续执行接收数据报。然后udp服务器程序在fork的子进程中创建 <br>
新的套接口,在这个新的套接口上与客户端传输数据。 <br>
<br>
<br>
-- <br>
易朽的是生命,似那转瞬即谢的花朵;然而永存的,是对未来的渴望, <br>
是那生生世世传递下来的,不朽的,生的激情。每一朵勇敢开放的花, <br>
都是一个死亡唇边的微笑。 <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="96.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 + -