【问题标题】:udp socket stops receiving dataudp socket 停止接收数据
【发布时间】:2013-08-25 13:09:26
【问题描述】:

我正在学习python中的网络编程,我正在尝试编写一个从android sdkhttps://github.com/android/platform_development/tree/master/samples/ToyVpn分叉的Toy 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 来调试我的程序。

【问题讨论】:

    标签: python sockets udp


    【解决方案1】:

    由于您在 Internet 上尝试您的客户端,因此所有 Internet 新网络都代表了整个可能的原因。

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 感谢您的解决方案。可能 udp 套接字不是 NULL。因为它可以向远程服务器发送数据并且服务器可以正常接收
      猜你喜欢
      • 2015-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多