【问题标题】:Python won't Receive UDP Packets(Non Broadcast)Python 不会接收 UDP 数据包(非广播)
【发布时间】:2016-11-01 13:22:28
【问题描述】:

我正在 Windows XP 机器上用 python2.7 编写脚本。本机使用不同的网卡连接到多个网络。我已经发布了一个与此问题相关但没有直接解决的问题here

我有一台服务器通过 UDP 以大约 1 秒的间隔发送“状态数据”

服务器 IP:10.42.40.34 我的机器 IP:10.31.9.0

我使用的卡:Intel(R) Gigabit CT Desktop Adapter

我可以观察到正在发送到“我的机器”的“服务器”数据包(通过 wireshark)。

2995    19.592120   10.42.40.34 10.31.9.0   UDP 455 000000007e4e9ca700000000040404000301000000000100... Source port: 62415  Destination port: 62415
3012    19.688119   10.42.40.34 10.31.9.0   UDP 455 000000007e4e9ca700000000040404000301000000000100... Source port: 62415  Destination port: 62415

套接字创建没有问题:

self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

但是,当我将套接字绑定到接口时:

self.sock.bind(('10.31.9.0', 62415))

然后使用(不设置超时):

reply, addr = self.sock.recvfrom(65535)

要接收,我的脚本只是等待recvfrom() 方法调用。这对我来说意味着它没有接收数据包。即使我确认它是通过 Wireshark 进行的。

我真的把头撞到墙上了,任何帮助都会非常感激......

波纹管是从wireshark提取的完整“状态”数据包,我在想可能某些标头信息可能不好,这就是python忽略它的原因...... IDK

0000   03 00 00 00 81 b5 02 00 00 2a 28 20 08 00 45 00  .........*( ..E.
0010   01 b8 1b 2b 40 00 01 11 17 a0 0a 2a 28 22 0a 1f  ...+@......*("..
0020   09 00 f3 cf f3 cf 01 a4 00 00 00 00 00 00 7e 4e  ..............~N
0030   9c a7 00 00 00 00 04 04 04 00 03 01 00 00 00 00  ................
0040   01 00 3e 99 99 9a 01 01 00 00 00 00 00 00 00 00  ..>.............
0050   00 00 00 00 00 00 00 00 00 00 3e 8c e7 04 3e 9c  ..........>...>.
0060   43 2d bf 17 5f 6e bf 17 5f 6e 00 00 00 00 00 00  C-.._n.._n......
0070   00 00 03 01 00 00 03 00 00 00 04 04 00 00 04 04  ................
0080   00 00 04 04 00 00 04 04 00 00 00 00 00 01 00 00  ................
0090   00 00 00 00 00 00 03 00 00 00 00 00 00 40 00 00  .............@..
00a0   00 00 40 90 00 00 40 86 4c cb 40 90 00 00 40 86  ..@...@.L.@...@.
00b0   4c cb bf 09 09 21 40 6a 57 4e 40 6a 57 4e 3f dc  L....!@jWN@jWN?.
00c0   b1 4e 3f dc b1 4e bf f7 fd 4e bf f7 fd 4e 3e 80  .N?..N...N...N>.
00d0   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00e0   00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00  ................
00f0   00 0f 01 00 00 00 00 00 00 00 00 ee ee 00 00 00  ................
0100   00 01 01 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0110   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0120   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0130   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0140   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0150   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0160   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0170   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0180   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0190   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
01a0   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
01b0   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
01c0   00 00 79 c7 42 05 56                             ..y.B.V

【问题讨论】:

  • 您是否使用socket.AF_INETsocket.SOCK_DGRAM 创建了套接字?
  • 是的,我已经编辑了我的问题以反映这一点......
  • 也许您可以尝试将缓冲区从 65535 更改为 1 以验证这里发生的情况并不奇怪(也许它正在等待完整的缓冲区填满)
  • 不,刚刚试过,不是这样的...我最初将它设置为 1024,但它无法正常工作。我在某处读到 65535 是 UDP 数据包的理论最大值......但我不确定它是否在我编写的其他应用程序上运行良好
  • 你在运行 Linux 吗?您是否使用netstat 验证了您的脚本确实在侦听预期的地址和端口?使用 netstat -lp(作为 root),您应该会看到类似以下内容:udp 0 0 10.31.9.0:62415 *:* 3210/python

标签: python sockets networking udp


【解决方案1】:

事实证明,我的“服务器”发送的数据包不是 IP 犹太洁食。所以他们在网络和传输层被拒绝。解决方案是不使用 python 套接字类,而是使用winpcap 和 ctypes 直接与 OSI-L2 通信

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-02
    • 2018-08-19
    • 1970-01-01
    • 2021-08-02
    • 1970-01-01
    • 2023-03-23
    相关资源
    最近更新 更多