我正在编写代码,在两个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
匹配。
但我不想让我的服务器听到未在指定协议上发送的流量,因此这不是一个解决方案。我该怎么做?
socket_address
的代码吗? - bstpierre