有两个Linux C程序,一个叫做“发送者”,另一个称为“接收者”。两个程序都在同一网络接口(eth0)上使用原始(数据包)套接字。它们使用自定义以太网协议(类型)进行通信。是的,关键是能够访问原始以太网帧。
套接字以某种方式打开:
sock = socket(AF_PACKET, SOCK_RAW, htons(MY_CUSTOM_ETH_PROTOCOL));
Receiver发出此信息以从原始套接字读取:
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可以看到它们。
如果两个程序在与交换机连接的不同机器上运行,则接收方将接收发送方发出的以太网帧。
在第一种情况下,没有看到错误的迹象。
这可能是什么?我需要使原始套接字能够接收由其他原始套接字放在线上的所有原始以太网帧。
答案 0 :(得分:0)
分辨率:如果我像这样创建套接字:
socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
收到所有以太网帧。由于我的软件包含基于以太网帧类型的过滤,因此它可以选择属于自定义协议的以太网帧。
谢谢!