我正在编写代码发送两个Linux机器之间的原始以太网帧。为了测试这个,我只想得到一个简单的客户端发送和服务器接收。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 2010-07-29 21:58:06