0

我正在使用 ruby​​ 套接字,所以我最终尝试将一个 IP 数据包放在一起,然后我拿了一个 ip 数据包并尝试制作一个像它一样的新数据包。

现在我的问题是:如果数据包是:45 00 00 54 00 00 40 00 40 01 06 e0 7f 00 00 01 7f 00 00 01,这显然是十六进制,所以我将其转换为十进制,然后使用 .pack 方法转换为二进制数据,并将其传递给 send 方法,然后Wireshark显示给我与我创建的东西非常奇怪的不同,我做错了什么???,我知道,但无法弄清楚:

@packet = 0x4500005400004000400106e07f0000017f000001 #i converted each 32 bits together, not like i wrote
@data = ""
@data << @packet.to_s
@socket.send(@data.unpack(c*).to_s,@address)

还有另一种方法可以解决整个问题吗?例如,我可以直接将要发送的数据写入套接字缓冲区吗?

提前致谢。

4

2 回答 2

3

从十六进制 Bignum 开始是一个新颖的想法,尽管我无法立即想到利用它的好方法。

无论如何,麻烦从.to_sBignum 上的 开始,它会产生一个用你的数字的十进制表示创建一个字符串的效果,让你离比特更远,而不是更近。不知何故,你c*似乎也失去了它的报价。

但是把它们放回去,然后你解压字符串,它会得到一个整数数组,它们是原始十六进制字符串的数值的十进制表示中数字的 ascii 值,然后你.to_s会这样做(IO 会做无论如何,所以,至少没有责备)但是这会产生一个字符串,该字符串具有解压缩字符串的 ascii 数字的可打印表示,所以你现在离最初的意图还有光年。

>> t = 0x4500005400004000400106e07f0000017f000001
=> 393920391770565046624940774228241397739864195073
>> t.to_s
=> "393920391770565046624940774228241397739864195073"
>> t.to_s.unpack('c*')
=> [51, 57, 51, 57, 50, 48, 51, 57, 49, 55, 55, 48, 53, 54, 53, 48, 52, 54, 54, 50, 52, 57, 52, 48, 55, 55, 52, 50, 50, 56, 50, 52, 49, 51, 57, 55, 55, 51, 57, 56, 54, 52, 49, 57, 53, 48, 55, 51]
>> t.to_s.unpack('c*').to_s
=> "515751575048515749555548535453485254545052575248555552505056505249515755555157565452495753485551"

这在某种程度上很有趣。所有的信息都还在,有点。

无论如何,您需要制作一个二进制字符串。要么只是<<数字:

>> s = ''; s << 1 << 2 
=> "\001\002"

或者使用数组#pack:

>> [1,2].pack 'c*'
=> "\001\002"
于 2009-12-05T23:20:55.310 回答
0

首先检查您的主机字节顺序,因为您在wireshark 中看到的是网络字节顺序(BigEndian)。然后在 Wireshark 中,您将看到协议头(取决于它是 TCP 套接字还是 UDP 套接字),然后是数据。你不能直接发送IP数据包。因此,您可以在特定数据包的数据部分(即 TCP/UDP 数据包的数据部分)中看到此特定数据。

于 2009-12-05T21:21:29.833 回答