我正在学习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
来调试我的程序。
答案 0 :(得分:0)
由于您在互联网上尝试使用您的客户端,因此所有互联网新工作都代表着可能的全部原因。
这里没有简单的调试方法。可能的原因当然可能是软件错误,也可能是您和远程服务器之间的一些中间网络配置。
您应该使用您和服务器之间的良好udp
或命令行wireshark
捕获tcpdump
流量,并检查您是否停止发送数据包或服务器是否正在停止接收他们。
如果您发送数据包但服务器没有收到它们(服务器上为tcpdump
),那么网络上有一些东西决定过滤您的数据包。如果它不在服务器上(例如防火墙规则对数据包进行速率限制或类似的事情),那么在不修改程序逻辑的情况下,你无法做到这一点。比如每隔X秒更改UDP
端口或使用持久tcp
连接。
答案 1 :(得分:0)
udp套接字不稳定,一旦扫描或其他事件占用您的网络接口一段时间后可能会变为空(特别是在Android上)。使用tcp可以避免此问题。如果你想维护一个稳定的udp,请继续监控你的udp套接字的状态;如果它变为null或发生任何异常情况,请删除此套接字并创建一个新套接字。将这些重新激活的人员放在一个循环中,以便你的udp套接字始终处于活动状态。