udp套接字停止接收数据

时间:2013-08-25 13:09:27

标签: python sockets udp

我正在学习python中的网络编程,我正在尝试编写一个从android sdk https://github.com/android/platform_development/tree/master/samples/ToyVpn分叉的玩具vpn。

我的玩具vpn是https://github.com/325862401/ToyVPN

这只适用于Linux。 我的家庭网络是NAT的背后。

我可以在连接到远程服务器后使用此vpn上网。 但大约半小时或一段时间后,客户端udp套接字停止接收任何数据,但服务器可以正常接收和发送。 此时我必须终止我的客户端并再次运行ToyVpnClient。 它会正常工作一段时间,直到它再次停止接收为止。

请帮我查一下客户日志。

>2013-08-24 11:42:38 INFO     receive data from the tunnel timeout`

你可以看到,当问题发生时,套接字总是发送,而不是接收。

>表示send<表示receive

我想知道为什么udp套接字停止接收数据。

是否有任何调试方法可以找到原因?

现在我刚刚使用logging来调试我的程序。

2 个答案:

答案 0 :(得分:0)

由于您在互联网上尝试使用您的客户端,因此所有互联网新工作都代表着可能的全部原因。

这里没有简单的调试方法。可能的原因当然可能是软件错误,也可能是您和远程服务器之间的一些中间网络配置。

您应该使用您和服务器之间的良好udp或命令行wireshark捕获tcpdump流量,并检查您是否停止发送数据包或服务器是否正在停止接收他们。 如果您发送数据包但服务器没有收到它们(服务器上为tcpdump),那么网络上有一些东西决定过滤您的数据包。如果它不在服务器上(例如防火墙规则对数据包进行速率限制或类似的事情),那么在不修改程序逻辑的情况下,你无法做到这一点。比如每隔X秒更改UDP端口或使用持久tcp连接。

答案 1 :(得分:0)

udp套接字不稳定,一旦扫描或其他事件占用您的网络接口一段时间后可能会变为空(特别是在Android上)。使用tcp可以避免此问题。如果你想维护一个稳定的udp,请继续监控你的udp套接字的状态;如果它变为null或发生任何异常情况,请删除此套接字并创建一个新套接字。将这些重新激活的人员放在一个循环中,以便你的udp套接字始终处于活动状态。