荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: everlove.bbs@bbs.shuoshuo.net (我是如此厌倦), 信区: Linux
标  题: unp第二十章学习体会
发信站: 寂寞森林 (Mon Sep 23 10:52:54 2002)
转信站: SZUBBS!news2.happynet.org!news.happynet.org!LonelyWood


发信人: clown (梧桐叶), 信区: UNP
标  题: unp第二十章学习体会
发信站: UNIX编程 (2001年10月10日21:25:23 星期三), 站内信件

本章介绍的是高级udp编程,实际上就是在udp套接口中
完成以下几件事情:

1)得到接收到的报文的目的ip地址,也就是要知道是本
地主机的哪块网卡的哪个ip地址收到的该报文。

书上介绍的是使用套接口选项IP_RECVDSTADDR和IP_RECVIF,
然后使用recvmsg函数得到这些信息,然而Linux不支持
这两个选项,我通过测试,发现可以使用getsockname得到
udp报文的目的ip和端口,而具体是哪个接口接收的该报文
没有简便的方法得到。

2)给udp应用程序增加可靠性
主要就超时重传(处理数据报丢失)和给报文添加一个序列
号(验证数据的有效性)。实现方法就是在udp报文前面添加
两个字段:序列号字段和服务器返回的时间戳。实际应用中,
服务器返回的时间戳是客户的发送报文中填写的,用于客户
计算数据报的往返时间。

关于超时重传时间的计算和详细的使用可以看看书上的例子,
这些都比较简单,就不再介绍了。

3)并发udp服务器
以前写的udp服务器的例子都是迭代执行的,书上分两种情况
介绍了如何使用并发udp服务器。

首先,如果udp服务器不由inetd启动,也就是说是一个单独的
服务器,那么在数据报到达,recvfrom返回以后,fork一个子
进程。父进程继续调用recvfrom,而子进程则创建一个新的套
接口,然后bind一个临时端口,然后在这个新的套接口上向客
户发送数据。

其次,如果udp服务器由inetd启动,因为在inetd.conf中udp服务
一般指定为wait(为什么使用wait见书本Page284),这就导致
inetd停止在该套接口上,直到inetd的子进程中指,也就是该udp
服务器终止。因此在inetd中,有数据到达以后,一般会fork一个
子进程来执行该udp服务器程序,这时udp服务器程序应该首先接收
该数据报,然后fork一个子进程,父进程exit,这样inetd就能够
继续执行接收数据报。然后udp服务器程序在fork的子进程中创建
新的套接口,在这个新的套接口上与客户端传输数据。


--
易朽的是生命,似那转瞬即谢的花朵;然而永存的,是对未来的渴望,
是那生生世世传递下来的,不朽的,生的激情。每一朵勇敢开放的花,
都是一个死亡唇边的微笑。
※ 来源:·UNIX编程 www.tiaozhan.com/unixbbs/·[FROM: 211.69.205.23]

--
我站在夜的尽头
窗外的雨悄悄坠落





※ 来源:.寂寞森林 http://bbs.shuoshuo.net  ◆ FROM: 211.161.158.231


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店