【发布时间】:2014-12-04 15:06:14
【问题描述】:
我目前正在尝试用 Ruby 编写一些东西,它将通过原始套接字发送数据。部分原因可能是对套接字的理解有些摇摆不定,但我觉得资源几乎 - 但不完全在那里。
特别是,我正在尝试转换以下 Python 代码(以防万一):
#!/usr/bin/env python
from socket import socket, AF_PACKET, SOCK_RAW
s = socket(AF_PACKET, SOCK_RAW)
s.bind(("lo", 0))
geonet_frame = "\x00\x1f\xc6\x51\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\xc6
\x51\x07\x07\x07\x07\x07\x07\xef\x06\x07\x35\x97\x00\x24\x8c\x7a\xdf\x6f\x08
\x00\x45\x00\x00\x3d\xf3\x7f\x40\x00\x40\x11\x30\xc6\x0a\x01\x01\x68\x0a\x01
\x01\x01\x99\x80\x00\x35\x00\x29\x16\xa5\x01\x76\x01\x00\x00\xff\x00\x00\x01
\x00\x00\x00"
s.send(geonet_frame)
在搜索这个问题时,我最常看到的结果是this Stack Overflow question,它没有直接提供任何可行的代码示例,以及this explanation,它似乎比我需要的要多得多,而且似乎还包含一个文件我无法访问。
我已经尝试了documentation for the Socket class 中列出的一些方法,但即使我能做到,我似乎也永远无法达到相同的结果。例如,我可能会尝试:
soc = Socket.open(Socket::PF_INET, Socket::SOCK_RAW, Socket::IPPROTO_RAW)
soc.send(mypacket, 0, Socket.pack_sockaddr_in(0, "127.0.0.1"))
...虽然它会完成,但它不会产生所需的结果(在这种情况下,它不会在 TCPDump 上创建一个 DOS,如 here 所示,而等效的 Python 代码会)。
这在 Ruby 中是否比我预期的更复杂?还是我只是缺少一些可以让我做到这一点的神奇功能组合?
更新:这是捕获所需数据包的图片。
【问题讨论】:
标签: ruby sockets translation