linux原始套接字能不能不收自己发出去的数据
背景:用原始套接字直接操作数据链路层,走自定义协议,数据开头不是dstmac srcmac 协议号
即除了底层物理链路用的网口,其他一点关系都没了
这种需求可能写一个内核模块更合适,但能力有限,skb啥的都只是了解一些概念而已,因此选择用原始套接字实现
socket(PF_PACKET, SOCKET_RAW, htons(ETH_P_ALL));
其他一些绑定eth的代码不贴出来了,都是标准的
发送试过sendto, write接收试过read, recv , recvfrom,都能收发
问题来了:
我想达到的效果: 发送一个报文,然后接收一个ack报文
而实际情况是: 我发送一个报文,首先收到的是自己发出去的报文,然后才是ack
就有点像tcpdump,在链路上收发的数据全被读出来了
由于典型应用是发1518,收12字节应答
结果变成了发1518,收1518,应用层判断丢弃,再收12字节应答
因为处理器频率很低,这种无意义的数据拷贝很影响性能
我尝试了一种方法,就是按照以太网帧的方式
dstmac srcmac protocol中的protocol字段要求对方应答时必须设置为一个特殊值,和发送区分开,这样原始套接字不用ETH_P_ALL,而用自定义值就能只收应答数据了
求教各位大神,如何配置原始套接字能让只接收真正收到的数据,而不是把自己发出去的也收回来,cpu资源真的不够把数据收到应用层判断