UDP套接口编程
一、 基于UDP套接口的客户端/服务器编程常遇到的一个问题是:数据包丢失。
如果一个客户向服务器发送数据报,并且希望服务器接收到数据报并进行处理后,反馈相应的信息。如果客户端向服务器发送数据的过程中,数据报丢失(比如说被客户和服务器主机之间的某个路由器丢失),客户将阻塞于recvfrom这样的系统调用,等待一个永远不会到达的服务器应答。类似的,服务器向客户端发送数据也可能会遇到类似的问题。
此问题的一个解决方案是设置超时。但是,此解决方案并不是完整的解决方案,举例来说,如果我们确实超时了,我们将无从判断超时原因是我们的数据报没有到达服务器,还是服务器的应答没有回到客户端。
二、由于客户临时端口号的任何进程都可往客户发送数据,而且这些数据报会与正常的服务器应答混杂,导致客户端无法识别是否是正常的服务器数据反馈。这个问题的一个解决方案是验证接收到的响应。具体来说,客户端修改recvfrom调用以返回数据报发送者的IP地址和端口号,保留来自我们的数据报所发往服务器的应答,而忽略任何其他数据报。然而,这样做还是有缺陷的。如果服务器运行在一个只有单个IP地址的主机上,那么这样的程序是可以使用的,然后,如果服务器主机是多宿的,那么就会遇到问题,因为从服务器反馈的信息可能显示不同的Ip地址,一个解决办法是:得到recvfrom返回的IP地址后,客户通过DNS查找服务器主机的名字来验证该主机的域名而不是验证IP地址。另一个解决方案是:UDP服务器给服务器主机上配置的每个IP地址创建一个套接口,bind每个IP地址到各自的套接口,然后在所有这些套接口上使用select,再从可读的套接口给出应答。既然用于给出应答的套接口上绑定的IP地址就是客户请求的宿IP地址,这就保证应答的源地址与请求的宿地址相同。