且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

《UNIX网络编程 卷1:套接字联网API(第3版)》——8.4 UDP回射服务器程序:dg_echo函数

更新时间:2021-07-22 05:42:59

本节书摘来自异步社区《UNIX网络编程 卷1:套接字联网API(第3版)》一书中的第8章,第8.4节,作者:【美】W. Richard Stevens , Bill Fenner , Andrew M. Rudoff著,更多章节内容可以访问云栖社区“异步社区”公众号查看

8.4 UDP回射服务器程序:dg_echo函数

图8-4给出了dg_echo函数。

《UNIX网络编程 卷1:套接字联网API(第3版)》——8.4 UDP回射服务器程序:dg_echo函数

读数据报并回射给发送者
8~12 该函数是一个简单的循环,它使用recvfrom读入下一个到达服务器端口的数据报,再使用sendto把它发送回发送者。

尽管这个函数很简单,不过也有许多细节问题需要考虑。首先,该函数永不终止,因为UDP是一个无连接的协议,它没有像TCP中EOF之类的东西。

其次,该函数提供的是一个迭代服务器(iterative server),而不是像TCP服务器那样可以提供一个并发服务器。其中没有对fork的调用,因此单个服务器进程就得处理所有客户。一般来说,大多数TCP服务器是并发的,而大多数UDP服务器是迭代的。

对于本套接字,UDP层中隐含有排队发生。事实上每个UDP套接字都有一个接收缓冲区,到达该套接字的每个数据报都进入这个套接字接收缓冲区。当进程调用recvfrom时,缓冲区中的下一个数据报以FIFO(先入先出)顺序返回给进程。这样,在进程能够读该套接字中任何已排好队的数据报之前,如果有多个数据报到达该套接字,那么相继到达的数据报仅仅加到该套接字的接收缓冲区中。然而这个缓冲区的大小是有限的。我们已在7.5节随SO_RCVBUF套接字选项讨论了这个大小以及如何增大它。

图8-5总结了第5章中的TCP客户/服务器在两个客户与服务器建立连接时的情形。

《UNIX网络编程 卷1:套接字联网API(第3版)》——8.4 UDP回射服务器程序:dg_echo函数

服务器主机上有两个已连接套接字,其中每一个都有各自的套接字接收缓冲区。

图8-6展示了两个客户发送数据报到UDP服务器的情形。

《UNIX网络编程 卷1:套接字联网API(第3版)》——8.4 UDP回射服务器程序:dg_echo函数

其中只有一个服务器进程,它仅有的单个套接字用于接收所有到达的数据报并发回所有的响应。该套接字有一个接收缓冲区用来存放所到达的数据报。

图8-3中的main函数是协议相关的(它创建一个AF_INET协议的套接字,分配并初始化一个IPv4套接字地址结构),而dg_echo函数是协议无关的。dg_echo协议无关的理由如下:调用者(在我们的例子中为main函数)必须分配一个正确大小的套接字地址结构,且指向该结构的指针和该结构的大小都必须作为参数传递给dg_echo。dg_echo绝不查看这个协议相关结构的内容,而是简单地把一个指向该结构的指针传递给recvfrom和sendto。recvfrom返回时把客户的IP地址和端口号填入该结构,而随后作为目的地址传递给sendto的又是同一个指针(pcliaddr),这样所接收的任何数据报就被回射给发送该数据报的客户。