有没有办法通过C#将原始数据包以太网发送到其他主机?在Windows 7中,如果它有所不同.
我试图在我的PC上捕获主从(服务器 - 客户端)程序之间的localhost(环回127.0.0.1)TCP流量.Wireshark无法做到这一点,但我理解RawCap的确如此.
当我尝试运行程序时,RawCap说 "Unable to enter promiscuous mode (RCVALL_ON), using RCVALL_SOCKETLEVELONLY."
知道是什么导致了这个吗?
非常感谢!
我正在测试一段电缆故障查找软件,我想在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) 是否可以从标准计算机以太网接口直接读取物理以太网连接接口上的位?
例如,假设我想将笔记本电脑的以太网插孔用作差分逻辑探头(使用标准以太网电缆).我是否可能只是编写一个驱动程序来获取位数,或者驱动程序可以达到的限制是否有限制?
基本上,物理层只是将比特流发送到设备驱动程序,或者它是否进行任何解码,这将影响比特的解释或导致设备故障(例如使用不同的编码方案).
我想它归结为,我们是否可以通过编写合适的驱动程序将以太网端口用作任何标准数字差分通信链路,或者我们是否仅限于ieee规范(8b/10b等等).
我有一些软件可以模拟BER和网络延迟等问题.我需要一种方法来测试软件的BER模块,以确保它真正正常工作.我的解决方案是创建一个程序,发送原始以太网帧,类型字段设置为未使用的类型.以太网帧内部只是随机位.对于发出的每个帧,我需要将帧记录到pcap文件中.在网络链路的另一端将是一个接收应用程序,它只是将它看到的每个数据包写入自己的pcap日志.测试完成后,将比较两个pcap日志以获得BER.
我正在使用python模块Scapy,到目前为止它完成了我需要的一切.我可以发送带有随机数据的原始以太网帧,并在Wireshark中查看它们.但是,我不知道如何将wrpcap()方法附加到pcap文件,而不是覆盖.我知道我可以写一个包列表wrpcap,但是这个应用程序需要能够无限期地运行,我不想等到应用程序退出写入发送到硬盘的所有数据包.因为在内存中存储很多,如果发生了什么事,我将不得不从头开始测试.
我的问题是:如何pcap使用scapy而不是覆盖文件来附加到pcap文件?它甚至可能吗?如果不是那么什么模块可以做我需要的?
在寻找Scapy具有我的功能的东西时,我遇到了dpkt,但我没有找到很多文档.可以dpkt做我想问的问题,如果可以,我可以在哪里获得一些好的文档呢?
在嵌入式系统(2.4内核)中,我需要从不以root身份运行的进程对eth0接口进行原始套接字访问.
我尝试通过从命令行设置CAP_NET_RAW功能并使用cap_set_proc()以编程方式解决此问题,两者都没有成功.在我得到EPERM错误的程序中,似乎我没有权限这样做,在命令行上
无法在进程"1586"上设置上限:(不允许操作)
有没有更简单的方法来做我想要的?如果没有,成功设置CAP_NET_RAW功能需要哪些步骤?
编辑:我有root访问权限,但以root身份永久运行该进程是没有选择的.libcap的版本是1.10,没有'setcap'二进制文件,而是'setpcaps'.
编辑 - 回答George Skoptsov:
如果我说得对,你的建议是用setuid启动一个进程,然后设置CAP_NET_RAW功能,然后删除权限.我尝试使用以下代码,但它似乎不起作用,即使caps命令不返回错误.在seteuid()注释掉后,原始访问可以正常工作,但只有当进程以root身份运行时才会生效:
cap_t caps = cap_get_proc();
cap_value_t cap_list[1];
cap_list[0] = CAP_NET_RAW;
if (cap_set_flag(caps, CAP_EFFECTIVE, 1, cap_list, CAP_SET) == -1)
{
printf("cap_set_flag error");
}
if (cap_set_proc(caps) == -1)
{
printf("cap_set_proc error");
}
if (seteuid(getuid()) != 0)
{
printf("seteuid error");
}
function_that_needs_raw_access();
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助.克里斯
我的Java应用程序应该控制直接连接到我的计算机网络接口(Ubuntu和Windows)的外部设备(EtherCAT总线技术).没有连接其他网络设备.通信已在标准IEEE 802.3以太网帧上完成,没有IP堆栈.
发送数据的示例:
int etherType = 0x88A4; // the EtherType registered by IEEE
byte[] macBroadcast = new byte[] {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
byte[] macSource = new byte[] ... ; // MAC Address of my network interface card
byte[] buffer = ... // the data to send
device.write(macSource, macBroadcast, etherType, buffer);
Run Code Online (Sandbox Code Playgroud)
我尝试了使用pcap本机库的JNetPcap.给定的API很好,但是在重载时存在多线程问题,这迫使我放弃.
netty.io也是候选人.我不确定,但TCP/IP堆栈是强制性的.我对吗?
是否有其他想法与低级别以太网帧通信?我更喜欢像netty.io这样的纯java库,如果存在的话.
当然JNA/JNI也是一种选择.但我不想写C代码.
其他选择?
这个问题不是关于在Windows(XP或更好)上准确计时,而是通过回调或中断非常迅速地做某事.
我需要每1毫秒定期做一些事情,或者最好每100微秒做一次.我需要做的是以这个速率驱动一些同步硬件(以太网),以便向网络输出稳定的数据包流,并使该流看起来尽可能规则和同步.但如果问题可以与(以太网)设备分开,那么了解一般答案会更好.
在你说"甚至不考虑使用Windows !!!!"之前,有点背景.并非所有实时系统都有相同的要求.大多数时候歌曲和视频在Windows上可以接受,尽管平均每10-16ms左右需要处理音频或图像块.通过适当的缓冲,Windows可以具有可变延迟,但硬件可以广泛地免受它们的影响,并保持稳定的同步事件流.即便如此,我们大多数人都容忍偶尔的故障.我的应用就是这样 - 可能相当宽容.
对我来说,昂贵的选择是将我的整个应用程序移植到Linux.但Linux只是在同一硬件上运行的不同软件,所以我强烈倾向于编写一些更好的软件,并坚持使用Windows.我能够消除所有竞争的硬件和软件(没有互联网或其他网络访问,没有运行其他应用程序等).我有可能让Windows这样做吗?我会遇到什么限制?
我知道我的目标硬件有一个高性能事件定时器,并且该定时器可以编程为中断,但没有驱动程序.我可以写一个吗?那里有有用的例子吗?我还没找到一个.这会干扰QueryPerformanceCounter吗?我是否会使用以太网设备这一事实是否意味着如果我明智地使用select()会变得简单?
欢迎使用有用文章的指针 - 我已经找到了关于如何获得准确时间的几十个概述,但是除了使用相当于忙碌的等待之外,还没有关于如何做这样的事情的概述.有没有办法避免忙碌的等待?是否有内核模式或设备驱动程序选项?
我编写了一个C程序,它将以太网帧直接写入线路(以两种模式运行,发送器或接收器).发送方正在发送带有两个VLAN标记的帧(QinQ),但奇怪的是,当帧到达接收方时,ethertype已更改为标准(单个)VLAN封装帧的类型.NIC是否有可能这样做,或者Linux不允许这样做?Wireshark显示与tcpdump相同的行为.
为了解释下面的图像,发送器正在向以太网广播地址FF:FF:FF:FF:FF:FF发送帧以找到接收器(这些是通过交叉电缆连接的两台测试机,但下面的结果与开关或集线器).正如您所看到的那样,帧上有两个VLAN标记,外部标记的ethertype为0x8100,VLAN ID为40,内部VLAN的ethertype为0x8100,VLAN ID为20.我们都知道,使用QinQ帧时,外框应该具有0x88a8的ethertype!
当在我的应用程序中从发送方发送帧时,它们的外部ethertype为0x88a8,但根据下图,它们在内部和外部ethertypes上都接收到0x8100.突出显示的文本是接收者发送回复,因为您可以看到帧在外框上有0x88a8,在内部有0x8100.另一台机器上的tcpdump显示相同的内容(它是相同的代码!帧内部发送0x88a8外部0x8100但总是接收为0x8100外部和0x8100内部).

void BuildHeaders(char* &txBuffer, unsigned char (&destMAC)[6],
unsigned char (&sourceMAC)[6], short &PCP, short &vlanID,
short &qinqID, short &qinqPCP, int &headersLength)
{
int offset = 0;
short TPI = 0;
short TCI = 0;
short *p = &TPI;
short *c = &TCI;
short vlanIDtemp;
// Copy the destination and source MAC addresses
memcpy((void*)txBuffer, (void*)destMAC, ETH_ALEN);
memcpy((void*)(txBuffer+ETH_ALEN), (void*)sourceMAC, ETH_ALEN);
offset = (ETH_ALEN*2);
// Add on the QinQ Tag Protocol Identifier
vlanIDtemp = qinq
TPI = htons(0x88a8); …Run Code Online (Sandbox Code Playgroud) 我目前正在开发一个程序来扫描我的网络并发现网络上的计算机和设备.我使用各种操作在我发现的设备上查找数据,但希望区分网络设备和计算机.而且我想知道是否有人知道我该怎么做?
我看了一下SNMP,尝试连接到我的网络打印机,路由器和调制解调器.但我似乎只能连接到打印机,路由器或调制解调器都没有响应.
有没有其他方法来确定IP地址属于哪种设备?