如何在软件中可靠地产生以太网帧错误?

17 投票
1 回答
9011 浏览
提问于 2025-04-16 19:28

问题:

我正在测试一款用于查找电缆故障的软件,想要在一根cat5电缆上可靠且可重复地生成电缆故障。

目前我使用的是一段未扭绞的电缆,手动在电源旁边扭动电缆,但在应用程序中无法检测到任何故障(我是在读取以太网芯片上的故障计数器)。我不确定这是因为没有生成故障,还是软件/硬件的检测有问题。

有没有办法通过软件来实现这个?

我可以接受用更高级的语言,比如Java或Python来写,如果实在不行,我也愿意用C来拼凑,但我真的不想为了修复一个可能的bug而重写一个以太网驱动。

[编辑]:我想要制造电缆故障,而不是检测它们。

[编辑]:我已经通过FTP和SCP在处理过的电缆上传输了大文件,没有问题,在用wireshark检查流量时也没有看到错误。

[编辑]:另见一个类似的Python问题

解决方案:

好吧,经过一天多与C语言的斗争,这里是Python的解决方案。

首先,禁用以太网卡的自动校验和:

sudo ethtool -K eth1 tx off

然后,从Python发送你的有问题的数据帧:

#!/usr/bin/env python

from socket import *

#
# Ethernet Frame:
# [
#   [ Destination address, 6 bytes ]
#   [ Source address, 6 bytes      ]
#   [ Ethertype, 2 bytes           ]
#   [ Payload, 40 to 1500 bytes    ]
#   [ 32 bit CRC chcksum, 4 bytes  ]
# ]
#

s = socket(AF_PACKET, SOCK_RAW)
s.bind(("eth1", 0))
src_addr = "\x01\x02\x03\x04\x05\x06"
dst_addr = "\x01\x02\x03\x04\x05\x06"
payload = ("["*30)+"PAYLOAD"+("]"*30)
checksum = "\x00\x00\x00\x00"
ethertype = "\x08\x01"
s.send(dst_addr+src_addr+ethertype+payload+checksum)

谁说这一定要复杂……

PS:我爱Python。

1 个回答

7

如果你在用C语言编程,你可以通过使用 socket(AF_PACKET, SOCK_RAW, ...) 来发送一个原始的以太网帧,并且需要传入一个你自己生成的原始数据缓冲区的指针(比如,可以参考维基百科上的帧结构)。

我已经很久没做过这个了,所以不打算写一个示例代码片段来说明……

撰写回答