dsc*_*atz 7 sockets linux ethernet
我正在编写代码以在两个Linux机箱之间发送原始以太网帧.为了测试这个,我只想获得一个简单的客户端发送和服务器接收.
我让客户端正确地创建数据包(我可以使用数据包嗅探器看到它们).
在服务器端,我像这样初始化套接字:
fd = socket(PF_PACKET, SOCK_RAW, htons(MY_ETH_PROTOCOL));
Run Code Online (Sandbox Code Playgroud)
MY_ETH_PROTOCOL我用作ethertype的2字节常量在哪里,所以我没有听到无关的网络流量.
当我将这个套接字绑定到我的接口时,我必须在socket_addr结构中再次传递一个协议:
socket_address.sll_protocol = htons(MY_ETH_PROTOCOL);
如果我编译并运行这样的代码,那么它就会失败.我的服务器没有看到数据包.但是,如果我像这样更改代码:
socket_address.sll_protocol = htons(ETH_P_ALL);
服务器然后可以看到从客户端发送的数据包(以及许多其他数据包),所以我必须检查数据包,看它是否匹配MY_ETH_PROTOCOL.
但我不希望我的服务器听到未在指定协议上发送的流量,因此这不是解决方案.我该怎么做呢?
我已经解决了这个问题.
根据http://linuxreviews.org/dictionary/Ethernet/,参考MAC地址后面的2字节字段:
"64和1522之间的该字段的值表示使用具有长度字段的新802.3以太网格式,而1536十进制(0600十六进制)和更大的值表示使用具有EtherType子的原始DIX或以太网II帧格式 - 协议标识符."
所以我必须确保我的ethertype> = 0x0600.
根据http://standards.ieee.org/regauth/ethertype/eth.txt,使用0x88b5和0x88b6"可供公众使用,用于原型和特定于供应商的协议开发." 所以这就是我要用作ethertype的东西.我不需要任何进一步的过滤,因为内核应该确保只选择具有正确目标MAC地址的以太网帧并使用该协议.