本节书摘来自异步社区《UNIX网络编程 卷1:套接字联网API(第3版)》一书中的第8章,第8.15节,作者:【美】W. Richard Stevens , Bill Fenner , Andrew M. Rudoff著,更多章节内容可以访问云栖社区“异步社区”公众号查看
8.15 使用select函数的TCP和UDP回射服务器程序
现在,我们把第5章中的并发TCP回射服务器程序与本章中的迭代UDP回射服务器程序组合成单个使用select来复用TCP和UDP套接字的服务器程序。图8-24是该程序的前半部分。
创建监听TCP套接字
14~22 创建一个监听TCP套接字并捆绑服务器的众所周知端口,设置SO_REUSEADDR套接字选项以防该端口上已有连接存在。
创建UDP套接字
23~29 还创建一个UDP套接字并捆绑与TCP套接字相同的端口。这里无需在调用bind之前设置SO_REUSEADDR套接字选项,因为TCP端口是独立于UDP端口的。
图8-25给出了服务器程序的后半部分。
给SIGCHLD建立信号处理程序
30 给SIGCHLD建立信号处理程序,因为TCP连接将由某个子进程处理。我们已在图5-11中给出了这个信号处理函数。
准备调用select
31~32 我们给select初始化一个描述符集,并计算出我们等待的两个描述符的较大者。
调用select
34~41 我们调用select只是为了等待监听TCP套接字的可读条件或UDP套接字的可读条件。既然我们的sig_chld信号处理函数可能中断我们对select的调用,我们于是需要处理EINTR错误。
259~263
处理新的客户连接
42~51 当监听TCP套接字可读时,我们accept一个新的客户连接,fork一个子进程,并在子进程中调用str_echo函数。这与第5章中采取的步骤相同。
处理数据报的到达
52~57 如果UDP套接字可读,那么已有一个数据报到达。我们使用recvfrom读入它,再使用sendto把它发回给客户。