首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python sendto似乎没有发送

Python sendto似乎没有发送
EN

Stack Overflow用户
提问于 2015-07-09 04:46:42
回答 1查看 2K关注 0票数 5

我是Python新手,我试图使用套接字将字节数组作为原始数据包发送。我的IP是192.168.0.116,我发送给它的设备是192.168.0.64。这个客户端设备是一个基于微控制器的单元,它执行我的代码,只需嗅探以太网数据包并检查特定的模式。我正在使用UDP数据包,并尝试了客户端固件使用'Ostinato‘在我的电脑发送一个原始的UDP包。我正在使用Wireshark监控网络数据包流。客户端似乎可以很好地处理Ostinato发送的数据包。

但是,当我尝试用Python发送相同的数据包(使用如下所示的原始数据包)时,它似乎不会吐出字节,因为我在Wireshark上看不到任何东西,客户端也得不到任何数据。但是sendto()的返回值是正确的。因此,Python似乎将字节数组提供给要发送的缓冲区(由OS吗?)但到此为止。

代码语言:javascript
复制
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()

为了清楚起见,我已经把试过的部分去掉了。

我注意到的另一件事是,当套接字关闭时,需要一些时间。如果我注释掉sendto语句,它就会立即退出。因此,看来套接字关闭试图刷新发送缓冲区,后者未能发送数据包。

有什么想法吗?

EN

回答 1

Stack Overflow用户

发布于 2015-09-15 16:08:19

  1. Ilya是对的,您应该打开一个UDP套接字 socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
  2. 您正在绑定到端口0,该端口无效。如果这不是入站端口,则不需要绑定它。这也许可以解释为什么你的sendto电话阻塞了。
  3. send_data数组应该只包含您的数据,而不是“完整的以太网数据包”。
  4. 对于您的网络,send_data数组必须小于MTU大小,否则它可能会被静默删除。这是不同的,但在1300以下应该工作,超过1500几乎肯定不会工作。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31308318

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档