问题标签 [raw-ethernet]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 如何在 Windows 上每毫秒或更好地做某事
这个问题不是关于在 Windows(XP 或更好)上准确地计时,而是关于通过回调或中断非常快速地做某事。
我需要每隔 1 毫秒,甚至最好每 100 微秒定期做一些事情。我需要做的是以这种速率驱动一些异步硬件(以太网)以向网络输出稳定的数据包流,并使该流看起来尽可能规则和同步。但是,如果可以将问题与(以太网)设备分开,那么知道一般答案会很好。
在您说“甚至不要考虑使用 Windows !!!!!!”之前,请先了解一下上下文。并非所有实时系统都有相同的需求。尽管需要平均每 10-16 毫秒左右处理一次音频或图像块,但大多数情况下,歌曲和视频在 Windows 上的播放是可以接受的。通过适当的缓冲,Windows 可以有其可变的延迟,但硬件可以大致不受它们的影响,并保持稳定的同步事件流发生。即便如此,我们大多数人都能容忍偶尔出现的故障。我的应用程序就是这样 - 可能非常宽容。
对我来说,昂贵的选择是将我的整个应用程序移植到 Linux。但 Linux 只是在相同硬件上运行的不同软件,所以我强烈倾向于编写一些更好的软件,并坚持使用 Windows。我有幸能够消除所有竞争的硬件和软件(没有互联网或其他网络访问,没有其他应用程序运行等)。我是否有希望让 Windows 做到这一点?我会遇到什么限制?
我知道我的目标硬件有一个高性能事件定时器,并且这个定时器可以被编程为中断,但是没有驱动程序。我可以写一个吗?那里有有用的例子吗?我还没有找到一个。这会干扰 QueryPerformanceCounter 吗?我将使用以太网设备这一事实是否意味着如果我明智地使用 select() 一切都会变得简单?
欢迎提供有用文章的指针——我发现了许多关于如何获得准确时间的概述,但除了使用相当于繁忙等待的情况外,还没有关于如何做这样的事情的概述。有没有办法避免忙碌的等待?是否有内核模式或设备驱动程序选项?
python - Python Scapy wrpcap - 如何将数据包附加到 pcap 文件?
我有一些软件可以模拟网络上的 BER 和延迟。我需要一种方法来测试软件的 BER 模块,以确保它确实正常工作。我的解决方案是创建一个程序来发送原始以太网帧,并将类型字段设置为未使用的类型。以太网帧内部只是随机位。对于发送的每个帧,我需要将帧记录到pcap
文件中。在网络链接的另一端是一个接收应用程序,它简单地将它看到的每个数据包写入自己的pcap
日志。运行测试完成后,将比较两个 pcap 日志以获取 BER。
我正在使用 python 模块Scapy
,到目前为止它已经完成了我需要的一切。我可以发送带有随机数据的原始以太网帧,并在 Wireshark 中查看它们。但是,我不知道如何获取wrpcap()
附加到 pcap 文件的方法,而不是覆盖。我知道我可以将数据包列表写入wrpcap
,但是此应用程序需要能够无限期运行,并且我不想等到应用程序退出才能写入发送到硬盘的所有数据包. 因为这将是很多存储在内存中,如果发生了什么事,我将不得不从头开始测试。
我的问题是:如何pcap
使用scapy
而不是覆盖文件附加到pcap
文件?甚至可能吗?如果没有,那么什么模块可以做我需要的?
在寻找具有Scapy
's 能力的东西时,我遇到了dpkt
,但我没有找到很多关于它的文档。可以dpkt
按我的要求做吗?如果可以,我在哪里可以获得一些好的文档?
raw-ethernet - 本地主机上的原始以太网 PF_PACKET 问题
我正在用 c 语言进行原始以太网编程。我有两个文件客户端和服务器,它们在本地主机上运行。我在 socket() 中使用我自己的协议号进行通信。
在客户端,我有以下代码
然后我发送一些数据如下
在服务器端,我像在客户端一样创建套接字,并且我正在按如下方式进行 recvfrom
但我在服务器端没有收到任何数据包。谁能让我知道问题是什么?
c - 创建以太网 II 帧头?
如何Ethernet II
在 Linux 中创建帧头?802.3 帧头可以使用eth_header()
给出skbuffer
源和目标 MAC 和长度来创建。相同的函数是否也可以用于Ethernet II
帧格式,我们使用类型字段而不是长度?
linux - 用于暂停帧的 ethtool?
我正在 Linux 机器上创建一个以太网帧嗅探/转发程序,我将使用它来嗅探从计算机传输到以太网的帧,反之亦然。
我正在尝试激活暂停帧,这样我就不会丢失任何数据包,因为对路由器进行两步传输可能会导致一些延迟。
我发现这样做的唯一方法是使用 ethtool 例如,从接收端打开暂停帧:
我对此有疑问,但我希望 ethtool 专家可以放心。
使用“ethtool -A”可用的选项是打开或关闭自动协商。据我所知,自动协商与暂停帧关系不大。此外,ethtool 缺少有关暂停帧的可用选项有点令人不安。例如,管理帧发送方请求的暂停时间不是 ethtool 的选项。
那么,ethtool 真的是最好的还是唯一的配置暂停帧的方法?理想情况下,我想通过 C 代码配置它们,但如果 ethtool 是这样做的唯一方法,我只想通过使用 ethtool 配置暂停帧来确认我正在做正确的事情。
如果有人能指出我在 C 中配置暂停帧的正确方向,我将更加感激。
谢谢你。
linux-device-driver - 以太网没有收到广播数据包
我正在研究在 cisco IPTV 上运行的 2.6.15 内核。当盒子出现时,DHCP 客户端挂断。原因是 DHCP 客户端没有获取广播的 DHCP 提供消息。
当我读取 /proc/net/dev 文件时,它显示以太网设备(eth0)没有收到任何数据包。然后我在盒子上运行了 tcpdump,它还显示以太网接口上没有收到任何数据包。
然后我在测试PC(运行DHCP服务器)上运行了wireshark,它显示DHCP服务器广播了一个DHCP提供消息。
此 DHCP 客户端和服务器与其他机器一起工作正常,因此这些程序出现任何问题的可能性较小。以太网驱动程序中一定有问题。
我真的很困惑。我应该如何处理这个问题。请帮我。
localhost - RawCap 错误:“无法进入混杂模式 (RCVALL_ON),使用 RCVALL_SOCKETLEVELONLY。”
我正在尝试在我的 PC 上捕获主从(服务器-客户端)程序之间的 localhost(loopback 127.0.0.1) TCP 流量。Wireshark 不能这样做,但我知道 RawCap 可以。
当我尝试运行程序时,RawCap 说"Unable to enter promiscuous mode (RCVALL_ON), using RCVALL_SOCKETLEVELONLY."
知道是什么原因造成的吗?
非常感谢!
linux - 在 linux 2.4 上以普通用户身份访问原始套接字
在嵌入式系统(2.4 内核)中,我需要从不以 root 身份运行的进程对 eth0 接口的原始套接字访问。
我试图通过从命令行设置 CAP_NET_RAW 功能并以编程方式使用 cap_set_proc() 来解决这个问题,但都没有成功。似乎我没有这样做的权限,在程序中我得到一个 EPERM 错误,在命令行上
无法在进程“1586”上设置上限:(不允许操作)
有没有更简单的方法来做我想做的事?如果没有,成功设置 CAP_NET_RAW 能力需要哪些步骤?
编辑:我有 root 访问权限,但无法以 root 身份永久运行该进程。libcap 的版本是 1.10,没有“setcap”二进制文件,而是一个“setpcaps”。
编辑 - 回答乔治斯科普佐夫:
如果我猜对了,您的建议是使用 setuid 启动一个进程,然后设置 CAP_NET_RAW 功能,然后删除权限。我用下面的代码尝试了这个,但它似乎不起作用,即使 caps 命令不返回错误。注释掉 seteuid() 后,原始访问有效,但前提是该进程以 root 身份运行:
谢谢你的帮助。克里斯
java - 如何使用 jpcap 加快数据包捕获和数据包发送
DSP 将原始以太网数据包发送到 PC,而不是 PC 捕获这些数据包并发送 ack 响应。他们正在向 MAC 发送 MAC 消息,因此没有 IP 层。我想每 1ms 进行一次实时消息传递。DSP每1毫秒发送一次消息,但PC无法捕获消息并在1毫秒内发送回复。捕获和发送数据包需要 15 - 30 ms。这个结果对我来说太慢了。我怎样才能让它更快。我正在使用 jpcap 库和我的操作系统 Win XP x32。
捕获代码:
发送代码:
sockets - 为什么在执行 read() 时 ETH_P_IP 和 ETH_P_ALL 之间存在差异
我有以下设置:
当我使用在 linux 网桥上打开一个 RAW 套接字时
我将套接字绑定到 eth2。当客户端向服务器发送数据包时,网桥上运行的wireshark报告该数据包的源mac地址为client(eth0),目的mac地址为server(eth1)。
当我执行 aread()
时,读取的数据的前 6 个字节是目标 mac 地址,正确读取为 server(eth1)。
但是,当我将语句更改为
当我执行 aread()
时,读取的数据的前 6 个字节显示目标 mac 地址是 linux bridge (eth2)。
为什么会这样?内核或以太网卡驱动程序是否将其自己的 MAC 地址放入缓冲区而不是使用 ETH_P_IP 读取线路?