Unix网络编程学习笔记(1)

本文探讨了基于UDP套接字编程中常见的数据包丢失问题及其解决方案,包括设置超时和验证响应等策略。此外,还讨论了如何通过DNS查找和多IP地址环境下确保服务器反馈的正确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

UDP套接口编程

一、 基于UDP套接口的客户端/服务器编程常遇到的一个问题是:数据包丢失

如果一个客户向服务器发送数据报,并且希望服务器接收到数据报并进行处理后,反馈相应的信息。如果客户端向服务器发送数据的过程中,数据报丢失(比如说被客户和服务器主机之间的某个路由器丢失),客户将阻塞于recvfrom这样的系统调用,等待一个永远不会到达的服务器应答。类似的,服务器向客户端发送数据也可能会遇到类似的问题。

此问题的一个解决方案是设置超时。但是,此解决方案并不是完整的解决方案,举例来说,如果我们确实超时了,我们将无从判断超时原因是我们的数据报没有到达服务器,还是服务器的应答没有回到客户端。

 

二、由于客户临时端口号的任何进程都可往客户发送数据,而且这些数据报会与正常的服务器应答混杂,导致客户端无法识别是否是正常的服务器数据反馈。这个问题的一个解决方案是验证接收到的响应。具体来说,客户端修改recvfrom调用以返回数据报发送者的IP地址和端口号,保留来自我们的数据报所发往服务器的应答,而忽略任何其他数据报。然而,这样做还是有缺陷的。如果服务器运行在一个只有单个IP地址的主机上,那么这样的程序是可以使用的,然后,如果服务器主机是多宿的,那么就会遇到问题,因为从服务器反馈的信息可能显示不同的Ip地址,一个解决办法是:得到recvfrom返回的IP地址后,客户通过DNS查找服务器主机的名字来验证该主机的域名而不是验证IP地址。另一个解决方案是:UDP服务器给服务器主机上配置的每个IP地址创建一个套接口,bind每个IP地址到各自的套接口,然后在所有这些套接口上使用select,再从可读的套接口给出应答。既然用于给出应答的套接口上绑定的IP地址就是客户请求的宿IP地址,这就保证应答的源地址与请求的宿地址相同。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值