本节书摘来自异步社区《UNIX网络编程 卷1:套接字联网API(第3版)》一书中的第8章,第8.6节,作者:【美】W. Richard Stevens , Bill Fenner , Andrew M. Rudoff著,更多章节内容可以访问云栖社区“异步社区”公众号查看
8.6 UDP回射客户程序:dg_cli函数
图8-8给出了dg_cli函数,它执行客户的大部分处理工作。
7~12 客户处理循环中有四个步骤:使用fgets从标准输入读入一个文本行,使用sendto将该文本行发送给服务器,使用recvfrom读回服务器的回射,使用fputs把回射的文本行显示到标准输出。
我们的客户尚未请求内核给它的套接字指派一个临时端口。(对于TCP客户而言,我们说过connect调用正是这种指派发生之处。)对于一个UDP套接字,如果其进程首次调用sendto时它没有绑定一个本地端口,那么内核就在此时为它选择一个临时端口。跟TCP一样,客户可以显式地调用bind,不过很少这样做。
注意,调用recvfrom指定的第五和第六个参数是空指针。这告知内核我们并不关心应答数据报由谁发送。这样做存在一个风险:任何进程不论是在与本客户进程相同的主机上还是在不同的主机上,都可以向本客户的IP地址和端口发送数据报,这些数据报将被客户读入并被认为是服务器的应答。我们将在8.8节解决这个问题。
与服务器的dg_echo函数一样,客户的dg_cli函数也是协议无关的,不过客户的main函数是协议相关的。main函数分配并初始化一个某个协议类型的套接字地址结构,并把指向该结构的指针及该结构的大小传递给dg_cli。