繁体   English   中英

更多原始(数据包)套接字无法在同一网络接口上通信

[英]More raw (packet) sockets can't communicate on the same network interface

Linux C有两种程序,一种称为“发送器”,另一种称为“接收器”。 这两个程序都在同一网络接口(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));

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

谢谢!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM