使用 c/c++ 将数据发送到设备 /dev/eth0(或类似)的最低级别方法是什么

what's the lowest level way to send data to the device /dev/eth0 (or similar) with c/c++

我最近在 linux 和 window 上使用套接字接口在同一网络上的机器之间发送 TCP 和 UDP 数据包。通常,这是通过一些套接字结构完成的,具有打开、写入数据、读取数据和完成后关闭的方法。

没有这个套接字结构,有没有办法做到这一点?我的意思是,如果我使用它,这个结构会获取我传递给它的数据,用协议 headers 打包并通过网络发送。

如果我手动创建协议数据包和数据报,我是否可以使用类似于 cat file.txt > /dev/etho(或在我的情况下为 /dev/wlp5s0)但使用 c/c++ 来发送数据到网络上的另一台机器?

您无法直接打开 /dev/eth0,如果您尝试过,原因可能很明显:

$ cat /dev/eth0
cat: /dev/eth0: No such file or directory

网络设备在文件系统中的表示方式与其他硬件设备(例如磁盘和串行线路)不同。

正如评论中有人指出的那样,您可以做的是使用原始套接字。原始套接字允许您做您想做的事:发送完全形成的数据包,内核将按原样输出,无需以任何方式修改(TCP 校验和卸载非耐受)。

如果您希望有另一个方向,即 - 让内核将您的文件描述符视为网络设备,您可以使用 tap/tun 接口 /dev/net/tun。这允许您创建一个接口,内核将其视为一个实际的以太网设备,您可以控制获取的内容"received",内核让您知道它正在发送什么。