我正在编写代码以在两个 Linux 机器之间发送原始以太网帧。为了测试这一点,我只想获得一个简单的客户端发送和服务器接收。
我让客户端正确地制作数据包(我可以使用数据包嗅探器看到它们)。
在服务器端,我像这样初始化套接字:
fd = socket(PF_PACKET, SOCK_RAW, htons(MY_ETH_PROTOCOL));
MY_ETH_PROTOCOL
我用作以太网类型的 2 字节常量在哪里,所以我听不到无关的网络流量。
当我将此套接字绑定到我的接口时,我必须在 socket_addr 结构中再次向它传递一个协议:
socket_address.sll_protocol = htons(MY_ETH_PROTOCOL);
如果我编译并运行这样的代码,那么它会失败。我的服务器看不到数据包。但是,如果我像这样更改代码:
socket_address.sll_protocol = htons(ETH_P_ALL);
服务器然后可以看到从客户端发送的数据包(以及许多其他数据包),所以我必须对数据包进行一些检查以查看它是否匹配MY_ETH_PROTOCOL
。
但我不希望我的服务器听到未通过指定协议发送的流量,因此这不是解决方案。我该怎么做呢?