我正在编写一个应用程序来测试网络驱动程序以处理损坏的数据.我想使用原始套接字发送这些数据,因此发送机器的TCP-IP堆栈不会纠正它.
我只在Linux上编写这个应用程序.我有在系统调用中使用原始套接字的代码示例,但我真的希望尽可能保持测试的动态,并在Python中编写大部分(如果不是全部的话).
我在网上搜索了一些关于在python中使用原始套接字的解释和示例,但是没有找到任何真正有启发性的东西.只是一个非常古老的代码示例来演示这个想法,但绝不是有效的.
从我收集的内容来看,Python中的Raw Socket使用在语义上几乎与UNIX的原始套接字完全相同,但没有struct定义数据包结构的s.
我想知道在Python中编写测试的原始套接字部分是否更好,但在C中使用系统调用,并从主Python代码调用它?
我正在测试一段电缆故障查找软件,我想在cat5电缆上可靠且可重复地产生电缆故障.
目前我正在使用一米长的无线电缆,并在电源旁边手动蠕动电缆,但我无法检测到应用中的任何故障(我正在读取以太网ASIC上的以太网故障计数器.)是否这是因为没有产生故障,或者因为软件/硬件检测有问题,我无法分辨.
有没有办法在软件中执行此操作?
我决定用更高级别的语言编写一些东西,比如Java或python,并且作为最后的手段愿意将它放在C中,但我真的不想重写以太网驱动程序纯粹是为了修复可能的错误.
[编辑]:我想创建电缆故障 - 不检测它们.
[编辑]:我通过FTP和SCP传输大文件而没有使用篡改电缆的问题,我发现在使用wireshark检查流量时没有出现错误
好吧,花了一天时间与C战斗后,这就是python解决方案.
首先禁用以太网卡的自动校验和:
sudo ethtool -K eth1 tx off
Run Code Online (Sandbox Code Playgroud)
然后,从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 ]
# ] …Run Code Online (Sandbox Code Playgroud)