c-数据包套接字中sockaddr_ll的含义和用途



关于Linux的数据包套接字:在数据包套接字(AF_PACKET(中,应用程序实现以太网头和IP头来创建和发送数据包。这是我的问题。在这种情况下,我不理解套接字地址(sockaddr_ll(的必要性。与以太网头有什么不同?套接字地址的具体作用是什么?

就像sockaddr_in标识IP地址和端口一样,sockaddr_ll标识链路层地址和协议。在原始AF_PACKET套接字的情况下;地址";可能会令人困惑,因为我们谈论的不是IP/MAC或任何其他地址,而是接口(例如物理网络设备(和协议。

以太网标头包含有关以太网帧的元数据,并指示有效负载中封装的协议(EtherType字段(。sockaddr_ll可用于匹配或识别某个接口和协议(字段.sll_ifindex.sll_protocol(:

  • 当数据包套接字绑定到sockaddr_ll时,它将只接收来自指定接口(.sll_ifindex(和由内核从以太网标头的EtherType字段确定的指定协议(.sll_protocol(的数据包
  • 当接收(recvfromrecvmsg(时,由内核为用户填充sockaddr_ll结构,该结构标识在其上接收数据包的接口和协议
  • 发送(sendtosendmsg(时,sockaddr_ll结构用于指定在哪个接口上发送数据包,以及在以太网标头(EtherType字段(中设置哪个协议

另请参阅这篇有趣的文章,这篇文章可能有助于理解AF_PACKET套接字的工作原理:在C.中使用AF_PACKET套接字发送任意以太网帧

相关内容

  • 没有找到相关文章

最新更新