使用UDP套接字和python的奇怪网络行为

时间:2011-08-16 00:58:40

标签: python multithreading network-programming pipe

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

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

以下是脚本:http://codepad.org/V9Q1KcDT

(我不知道我是否应该直接将其粘贴到此处)

我的问题是这样的:我发送的字符串似乎占据了20%的时间,有时经常,有时候没有,而且似乎是随机的......

我做错了什么? UDP是如此不可靠吗? python thread + pipe + socket太慢了吗? 可能是我的shell提供商的某种网络问题? 我的程序有缺陷吗? 管道是与线程通信的好方法吗?

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

顺便说一句,如果我正在恐惧路由器,如果我不是唯一连接的计算机,路由器如何知道在哪里发送数据包? (当我是唯一一个时,我尝试过,它表现得相同)。

1 个答案:

答案 0 :(得分:0)

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

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

例如:

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

完成此基本测试后,再重新添加功能。例如,切换到UDP。一旦你在本地整理出你的UDP问题,尝试引入远程机器或线程等。

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