标签: raw-ethernet

对原始以太网帧使用 sendmsg/sendmmsg

我正在尝试使用 C 通过 sendmsg 发送原始以太网数据包。此代码成功打开一个原始数据包套接字,尝试用单个字节数组(char message[])填充 struct iovec,然后用目标地址、地址长度和指向包含的 struct iovec 的指针填充 struct msghdr消息。sendmsg() 为每次调用返回 EINVAL 但我不知道哪些参数无效。(我删除了一些 perror() 调用以使此代码更易于阅读;输出是“无效参数”。)

我找不到任何关于 sendmsg() 如何处理原始套接字的示例,但使用 sendto() 的类似代码按预期工作。在该代码中,我明确地形成了以太网帧,包括标头和协议信息,但据我所知,这对于 sendmsg() 调用来说不是必需的?我还试图让 message.iov_base 指向一个缓冲区,该缓冲区包含显式形成的以太网帧,包括 14 字节的标头,但 sendmsg() 也拒绝这样做。

sendmsg() 和 sendmmsg() 可以处理原始以太网帧吗?我是否遗漏了 iovec 使其无效的某些内容?

 30 int main(void) {
 32         unsigned char   dest[ETH_ALEN] = {0x11, 0x11, 0x11, 0x11, 0x11, 0x11}; // destination MAC address
 33
 34         // Socket variables
 35         int             s;  
 36         unsigned short  protocol = htons(ETH_P_802_EX1); 
 38 
 39         // Message variables
 40         char            message[] = {"Test …
Run Code Online (Sandbox Code Playgroud)

c sockets linux raw-ethernet

6
推荐指数
1
解决办法
2026
查看次数

为什么执行 read() 时 ETH_P_IP 和 ETH_P_ALL 之间存在差异

我有以下设置:

client(eth0) --- (eth2) linux bridge (eth1) --- (eth1) server
Run Code Online (Sandbox Code Playgroud)

当我使用以下命令在 linux 桥上打开 RAW 套接字时

fd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
Run Code Online (Sandbox Code Playgroud)

我的套接字绑定到 eth2。当客户端向服务器发送数据包时,运行在网桥上的wireshark会报告该数据包,其源MAC地址为客户端(eth0),目标MAC地址为服务器(eth1)。

当我执行 a 时read(),读取的数据的前 6 个字节是目标 MAC 地址,正确读取为 server(eth1)。

但是当我将语句更改为

fd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_IP));
Run Code Online (Sandbox Code Playgroud)

当我执行 a 时read(),读取的数据的前 6 个字节显示目标 MAC 地址是 linux 桥 (eth2)。

为什么会这样呢?内核或以太网卡驱动程序是否将自己的 MAC 地址放入缓冲区,而不是使用 ETH_P_IP 读取线路?

sockets ethernet raw-sockets raw-ethernet

5
推荐指数
1
解决办法
3万
查看次数

便携式硬实时C或C++原始以太网协议库

我正在尝试创建一个具有硬实时功能的业余爱好者便携式机器人库(Windows和Linux).它应该能够通过标准以太网连接到微控制器,将固件上传到该设备,通过现场总线连接到其他设备,并将固件上传到运行专用控制器的其他微控制器.如果需要硬实时,NIC将是RTnet支持的NIC.我希望典型的伺服速率至少为1 kHz,但最好是2 kHz或更高.它将运行一个完全自定义的协议(不是基于IP的TCP或UDP),因此开销很小,高速现场总线可以在不接收或发送帧时饱和.然后可以解释以太网帧中的有效载荷或将其发送到连接的设备.

1)我更喜欢将协议保留在C++中,但是知道使用"new"关键字不适用于实时编程.如果我选择使用C++语言而不是将项目转换为C,我会遇到哪些其他限制?人们会推荐教授如何利用C++并满足硬实时期限的书籍或网站吗?我相信它是可能的,我希望能够继续使用C++,因为Orocos项目使用实时C++.我宁愿不使用C代码.

2)为了保持便携式协议库的通用性,程序如何在非实时以太网适配器和RTnet以太网适配器上同时处理协议运行?

我所提出的一个具体问题是关于一个可以使用boost或Xenomai互斥锁的便携式Mutex类的问题.

问题2的解决方案1可能如下:如果应用程序也已使用Xenomai库编译,则可以使用布尔标志构造互斥锁,以说明在运行时将哪些方法(boost或Xenomai)包装以进行锁定和解锁.如果库是为Xenomai编译的,它可能包含boost mutex和Xenomai互斥锁.我不喜欢这个解决方案,因为如果项目是为Xenomai编译的,那么它将包含一个用于boost和Xenomai的互斥锁的私有变量,这似乎不那么优雅,只需要一个人需要的互斥锁.

问题2的解决方案2可能如下:将2个不同的派生类从纯虚拟接口方法的抽象类写入互斥锁,一个用于boost,一个用于Xenomai.我喜欢这种方式更好,但后来告诉在运行时使用哪个类是麻烦的.我可能不得不拥有一个增强池和Xenomai互斥体.这是大多数硬实时C++程序解决这个问题的方法吗?

我有这个问题不仅仅是一个互斥体,而是希望得到反馈,因为我不想从一开始就复制糟糕的设计模式.

3)我相信来自Beckoff的TwinCAT在Windows 7下实时运行EtherCAT.是否会出现任何在Windows 7或Windows 7下支持至少一个具有硬实时功能的NIC的爱好者无法触及的内容后来?也许有一个开源的Hypervisor项目.

4)此外,人们如何加载系统,以便他们的四核计算机使用每个核心的100%,以便他们可以判断他们的系统是否未实时运行?

c c++ protocols real-time raw-ethernet

5
推荐指数
1
解决办法
1553
查看次数

发送/接收原始以太网帧

我必须在 Linux 上编写一个应用程序,该应用程序需要与具有自定义以太网类型的设备进行通信。即使在如何编写这样的应用程序的SO中也有很多解决方案。缺点是需要 root 访问权限(据我所知)。之后释放 root 权限可能是一种选择,但这会带来一个问题,即该程序是在 IDE 中开发的,我不喜欢以 root 身份运行它。在我的特殊情况下,主应用程序是用 Python 编写的,这意味着授予对整个 Python 解释器的 root 访问权限。我正在寻找可能的替代方案。例如

  • 编写一个微型 UDP/TCP 服务器,通过 TCP/UDP 重定向每个原始数据包。这也可以用 Python 编写。只有这个小应用程序需要 root 权限。

  • 使用 socat 进行重定向,不幸的是我无法找到一个选项来只关心一种以太网类型而不被 IP 数据包溢出。

  • 还有其他想法吗?

ethernet raw-ethernet

5
推荐指数
1
解决办法
1904
查看次数

原始以太网的Java库

我正在寻找一个Java库,它可以让我访问原始以太网帧,用于读取和发送它们.我的最终目标是创建一个BACnet以太网网络扫描仪.

请注意,我不是在寻找TCP\IP.

有人知道这是一个很好的图书馆吗?

java ethernet raw-ethernet

4
推荐指数
1
解决办法
6504
查看次数

点击界面不会出现

我决定添加一个tap接口并在我的代码中使用它,但我能够将其状态设置为UP.

sudo ip -f link tuntap add tap10 mode tap
sudo ip link set tap10 up
Run Code Online (Sandbox Code Playgroud)

在此之后我做"ip link"

tap10: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN qlen 500
link/ether 26:cc:d2:b4:37:ea brd ff:ff:ff:ff:ff:ff
Run Code Online (Sandbox Code Playgroud)

DOWN:如何让这个状态UP?我正在尝试向它发送数据包,但没有收到任何信息.

linux kernel interface raw-ethernet

4
推荐指数
1
解决办法
3087
查看次数

如何使用VC++访问以太网端口?不使用套接字

我是以太网编程的初学者,我想访问以太网端口并向/从其发送/接收数据包.我想过使用CIM_EthernetPort类,但不知道怎么做.请帮忙.我必须编写一个程序来将数据发送到嵌入式系统.

mfc raw-ethernet visual-studio visual-c++

1
推荐指数
1
解决办法
3670
查看次数