网络相关问题(下)

DM8168芯片运行Linux操作系统,有两个物理网口。在某项目中需要绕过协议栈直接收发以太网帧,本文总结调试过程中的几处注意事项。

收发以太网帧

有两种原始套接字可以处理底层数据。一种是处理IP层及其上的数据,通过指定socket第一个参数为AF_INET来创建这种套接字。另一种是处理数据链路层及其上的数据,通过指定socket第一个参数为PF_PACKET来创建这种套接字。我们需要使用第二种原始套接字来直接收发以太网帧:

sd = socket (PF_PACKET, SOCK_RAW, htons (protocol))

其中protocol对应TCP/IP协议中链路层以太网帧的类型字段,如0x0800代表IP包,0x0806代表ARP包。在<include/linux/if_ether.h>中有详细定义。用户也可以定义自己的非标准类型,用在自组网中。

这样创建的socket与具体网络接口并没有关系,多网卡上任意一个网卡收到的符合protocol类型的数据包都会被传递到这个socket中。如果想指定从某个网卡上接收数据包,则要对接收数据过滤目的MAC地址。
首先通过ioctl()获取该网卡的MAC地址。interface是接口名,如”eth0”:

    struct ifreq ifr;
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值