有两个Linux C程序,一个称为"sender",另一个名为"receiver"。两个程序都在同一个网络接口(eth0)上使用原始(数据包)套接字。它们使用自定义以太网协议(类型)进行通信。是的,重点正是访问原始以太网帧。
插座是这样打开的:
sock = socket(AF_PACKET, SOCK_RAW, htons(MY_CUSTOM_ETH_PROTOCOL));
接收器发出此消息以从原始套接字读取:
recv(sock, eth_frame, MAX_ETH_FRAME_LEN, 0);
发送方发出此消息以写入原始套接字:
struct sockaddr_ll sa;
memset(&sa, 0, sizeof(sa));
sa.sll_family = AF_PACKET;
memcpy(sa.sll_addr, dst_mac, 6);
sa.sll_halen = 6;
sa.sll_ifindex = itf_idx;
我希望没有必要分享我如何组装有效的以太网帧,如何获得网络接口索引等。
问题:如果两个程序在同一台机器上运行,接收器无法看到发送器发出的以太网帧。然而,Wireshark可以看到所有这些。
如果这两个程序在通过交换机连接的独立机器上运行,则接收器将接收发送器发出的以太网帧。
在第一种情况下,没有看到错误的迹象。
这可能是什么?我需要使原始套接字能够接收其他原始套接字放在电线上的所有原始以太网帧。
分辨率:如果我创建这样的套接字:
socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
所有以太网帧都被接收。由于我的软件包含基于以太网帧类型的过滤,它可以选择属于自定义协议的以太网帧。
谢谢!