【问题标题】:Weird network behaviors with UDP sockets and pythonUDP套接字和python的奇怪网络行为
【发布时间】:2011-08-16 00:58:40
【问题描述】:

我制作了一些 python 脚本并在我的计算机和一些远程 shell(一些提供 shell 访问的网站)上运行它。

我使用线程、管道和 UDP 套接字以 P2P 方式传输数据,因此每个脚本都可以通过同一个套接字接收和发送。为了测试这是否可行,我在我的计算机上打开一个终端,并在连接到我的 shell 的 ssh 上打开另一个终端。我确保两台机器上的脚本相同,并为其提供一个 IP 地址。

这是脚本:http://codepad.org/V9Q1KcDT

(不知道要不要直接贴在这里)

我的问题是这样的:我发送的字符串似乎有 20% 的时间会降落,有时经常,有时不会,而且似乎是随机的......

我做错了什么? UDP有那么不可靠吗? python线程+管道+套接字太慢了吗? 会不会是我的 shell 提供商的某种网络问题? 我的程序有缺陷吗? 管道是与线程通信的好解决方案吗?

我没有使用 shell 没有问题,我没有尝试过,但它对于测试目的很有用。

顺便说一句,如果我是路由器,如果我不是唯一连接的计算机,路由器如何知道将数据包发送到哪里? (当我是唯一的人时我尝试过,它的行为相同)。

【问题讨论】:

    标签: python multithreading network-programming pipe


    【解决方案1】:

    用户数据报协议(UDP)很容易代表不可靠的数据报协议。 UDP 不提供有关传递的保证,因此如果您需要可靠性,您必须自己通过重新发送消息来实现它。

    也就是说,线程和多处理以及远程机器和网络是需要立即诊断的大量变量。我建议您退后一步,尝试将问题归结为更简单的问题。

    例如:

    • 首先尝试 TCP 而不是 UDP
    • 而不是线程,运行 2 个进程(一个执行 nit_send,一个执行 nit_recv)
    • 在本地机器上运行它们(使用本地主机:127.0.0.1

    一旦您完成了这个基本测试,然后重新添加功能。例如,切换到 UDP。一旦您在本地解决了 UDP 问题,请尝试引入远程机器或线程等。

    关于路由器问题,连接到您路由器的所有机器很可能都经过了 NAT,因此对于互联网上的机器,它们似乎都具有相同的 IP 地址(路由器的 IP 地址)。如果您想将流量路由到本地子网上的特定机器,请查看 NAT 和端口转发。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多