3

我有一个文件,其中包含二进制形式的原始 IP 数据包。文件中的数据包含完整的 IP 标头、TCP\UDP 标头和数据。我想使用任何语言(最好是 python)来读取这个文件并将数据转储到行上。

在 Linux 中,我知道您可以直接写入某些设备(echo "DATA" > /dev/device_handle)。使用 python 在 /dev/eth1 上打开会达到相同的效果(即我可以做 echo "DATA" > /dev/eth1)

4

2 回答 2

2

不; 没有/dev/eth1设备节点——网络设备与终端和硬盘驱动器等字符/块设备位于不同的命名空间中。您必须创建一个AF_PACKET套接字来发送原始 IP 数据包。

于 2012-10-23T23:35:17.597 回答
2

就像是:

#!/usr/bin/env python
import socket
s = socket.socket(socket.AF_PACKET, socket.SOCK_RAW)
s.bind(("ethX", 0))

blocksize = 100;
with open('filename.txt') as fh:
    while True:
        block = fh.read(blocksize)
        if block == "": break  #EOF
        s.send(block)

应该可以,但是没有测试过。

  • ethX需要更改为您的界面(例如eth1, eth2,wlan1等)
  • 您可能想玩弄blocksize. 一次 100 字节应该没问题,您可以考虑增加,但我会保持在 1500 字节以太网 PDU 以下。
  • 为此,您可能需要 root/sudoer 权限。我以前从原始套接字读取时需要它们,从未尝试过简单地写入一个。
  • 前提是您确实将数据包(并且只有数据包)转储到文件中。也不是任何类型的编码(例如十六进制)。如果一个字节是 0x30,它在你的文本文件中应该是“0”,而不是“0x30”、“30”或类似的东西。如果不是这种情况,您需要while用一些处理替换循环,但send仍然是一样的。
  • 因为我刚刚读到您正在尝试发送 IP 数据包——在这种情况下,您也可能需要一次构建整个数据包,然后将其推送到套接字。简单的while循环是不够的。
于 2012-10-23T23:35:27.030 回答