当前位置: 首页 > 面试题库 >

Linux原始以太网套接字绑定到特定协议

姚晋
2023-03-14
问题内容

我正在编写代码以在两个Linux盒之间发送原始以太网帧。为了测试这一点,我只想获得一个简单的客户端发送和服务器接收。

我让客户端正确地制作了数据包(我可以使用数据包嗅探器看到它们)。

在服务器端,我像这样初始化套接字:

fd = socket(PF_PACKET, SOCK_RAW, htons(MY_ETH_PROTOCOL));

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帧格式-
协议标识符。”

所以我必须确保我的以太类型> = 0x0600。

根据http://standards.ieee.org/regauth/ethertype/eth.txt,使用0x88b5和0x88b6是“可用于原型和特定于供应商的协议开发的公共用途”。这就是我将要用作ethertype的内容。我不需要任何进一步的过滤,因为内核应确保仅选择具有正确目标MAC地址并使用该协议的以太网帧。



 类似资料:
  • 问题内容: 我的应用程序在CentOS 5.5上运行。我正在使用原始套接字发送数据: 如何将此套接字绑定到特定的网络接口(例如eth1)? 问题答案: 第一行:设置变量 第二行:告诉程序绑定到哪个接口 第3-5行:获取接口名称的长度,并检查其大小是否太大。 六行:设置套接字的套接字选项,绑定到设备。 setsockopt原型: 此外,请确保您包括,和头文件

  • 问题内容: 当我在代码中指定要连接的IP时,我有一个小型的单边消息发送器,但是,我无法让套接字接受来自任何IP的连接。这是问题所在。 该是本地主机,如果我手动输入IP,例如,它的工作原理,但是,我怎么能离开它向所有人开放?还是我为此使用了错误的连接类型? 问题答案: 如果要绑定到所有可用的IPv4地址,请指定为IP地址。如果您在路由器后面,并且希望您的套接字可以通过Internet访问,而不是仅在

  • 问题内容: 我正在寻找一个Java库,该库将使我能够访问原始以太网帧,以读取和发送它们。我的最终目标是创建一个BACnet以太网网络扫描仪。 请注意,我不是在寻找TCP \ IP。 任何人都知道一个很好的库可以做到这一点吗? 问题答案: 也许Jpcap可以提供帮助。请注意,有一个具有相同名称的Sourceforge项目,但似乎不是同一项目。 这是一些示例代码(来自库的教程),该示例代码使用Jpca

  • 问题内容: 我正在使用一个守护程序,该守护程序侦听UDP广播数据包,并通过UDP进行响应。当一个包进来,我想知道哪个IP地址(或NIC)的包来到 TO 这样我就可以与该IP地址作为源地址进行响应。(出于很多麻烦的原因,我们系统的某些用户希望将同一台计算机上的两个NIC连接到同一子网。我们告诉他们不要,但是他们坚持要这样做。我不需要提醒我这是多么的丑陋。 ) 似乎没有办法检查数据报并直接找出其目的地

  • 问题内容: 我目前正在使用 属性启动Java VM,以便可以通过JConsole连接到Java VM 进行管理和监视。不幸的是,它监听计算机上的所有接口(IP地址)。 在我们的环境中,通常情况下,一台机器上同时运行多个Java VM。尽管可以告诉JMX侦听不同的TCP端口(使用),但是最好让JMX使用标准的JMX端口并仅绑定到特定的IP地址(而不是所有IP地址)。 这将使查找通过JConsole连

  • 问题内容: 对于linux c编程原始套接字,这是一个快速的问题。如果我只想使用原始套接字来监听任何接口,我是否真的必须绑定到ip地址或接口来监听流量?据我了解,我觉得我应该能够只调用sock();。然后启动recvfrom()流量。也许我错了,但是我看过一些不使用它的程序。 问题答案: 没错,您唯一需要做的就是打电话给then 。不过请注意,使用收听存在一些限制。 如果您不是在“发送后忘记”的基