使用 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",内核让您知道它正在发送什么。
我最近在 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",内核让您知道它正在发送什么。