有两个LinuxC程序,一个叫“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));

接收所有以太网帧。由于我的软件包含基于以太网帧类型的过滤,所以它可以选择属于自定义协议的以太网帧。
谢谢!

关于c - 更多原始(数据包)套接字无法在同一网络接口(interface)上通信,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41957553/

10-15 16:07