1、问题:
客户端:Udp通信,recvfrom阻塞接收数据。
服务端:当收到客户端发送的数据时,立刻反馈数据至客户端,客户端能收到反馈数据,但是如果等待两分钟之后再反馈至客户端,此时客户端不能收到数据;
其中,客户端运行在虚拟机中,虚拟机采用Nat模式与主机相连。
2、现象:
服务端:wireshark能抓到发往客户端的数据
客户端:客户端主机能抓到发往客户端的数据,虚拟机抓不到
说明,服务端发送的数据已经到达客户端虚拟机所在的主机,但是并没有将数据从主机发送至虚拟机。
3、原因:
由于客户端所在主机能够收到数据,而虚拟机收不到,所以猜测可能和虚拟机的网络连接方式有关,我的Ubuntu虚拟机采用Nat方式连接主机,经过查阅相关资料,发现这个解释可能有点靠谱:
经查资料,当虚拟机采用nat模式时,由于虚拟机与主机之间通过地址转换模式进行连接,此时在主机中维护了一张地址转换表,所以虚拟机可以通过主机访问到外部网络,外部网络是需要通过地址转换表来找到虚拟机的。
而地址转换表是会更新的,因为它要解除一些端口的占用,所以就会造成当等到时间过长时,此时地址转换表已经更新,udp数据包无法发送至正确的地址,所以就会造成客户端udp无法正常接收数据。
4、解决方法:
将虚拟机的网络连接方式改为桥接模式就可以了。(我的ubuntu虚拟机还需要手动设置静态IP地址)
或者采用TCP连接方式?(此方式未进行验证)
PS:此前一直对UDP面向无连接的,不可靠的通信没有概念,通过这个问题算是对这个特点有了一定的了解。