Python sendto似乎没有发送

时间:2015-07-09 04:46:42

标签: python sockets networking

我是Python新手并尝试使用套接字将字节数组作为原始数据包发送。我的IP为192.168.0.116,我发送给它的设备是192.168.0.64。该客户端设备是基于微控制器的单元,其执行我的代码以简单地嗅探以太网分组并检查特定模式。我正在使用UDP数据包并通过在我的PC中使用'Ostinato'来发送原始UDP数据包来尝试客户端固件。我正在使用Wireshark来监控网络数据包流。客户端似乎可以正常使用Ostinato发送的数据包。

然而,当我尝试使用Python发送相同的数据包时(使用如下的原始数据包),它似乎没有吐出字节,因为我无法在Wireshark上看到任何内容,也没有客户端获取任何数据。但sendto()的返回值是正确的。因此,似乎Python将字节数组提供给要发送的缓冲区(由OS?),但在那里停止。

import socket
CLNT_UDP_IP = '192.168.0.64'
CLNT_UDP_PORT = 5005
svr_sock = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_RAW)

send_data = [0x00, 0x11...]
send_data_arr = bytearray (send_data)
svr_sock.bind (('192.168.0.116',0))  
bytes_send = svr_sock.sendto (send_data_arr, (CLNT_UDP_IP, CLNT_UDP_PORT))
svr_sock.close()

为了清晰起见,我已经取出了try-except块。

我注意到的另一件事是当套接字关闭时,需要一些时间。如果我注释掉sendto语句,它会立即退出。所以看起来套接字关闭正在尝试刷新发送缓冲区,而发送缓冲区无法发送数据包。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

  1. Ilya是对的,你应该用

    打开一个UDP套接字

    socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

  2. 您正在绑定到端口0,这是无效的。如果这不是入站端口,则不需要绑定它。这可以解释您的sendto呼叫阻止的原因。

  3. send_data数组应仅包含您的数据,而不是"完整的以太网数据包"。

  4. send_data数组必须低于网络的MTU大小,否则可能会以静默方式删除。它有所不同,但1300以下应该可以工作,超过1500几乎肯定不会工作。