2017-09-16 85 views
0

我最近玩的Linux和Windows上的套接字接口在同一网络上的机器之间发送TCP和UDP数据包。通常,这是通过一些套接字结构完成的,方法是打开,写入数据,读取数据并在完成时关闭它。什么是最低级别的方式发送数据到设备/ dev/eth0(或类似)与c/c + +

有没有办法做到这一点,没有这种套接字结构?我的意思是,如果我使用它,这个结构将我传递给它的数据包装在协议头文件中并通过网络发送。

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

+1

您可以查看[原始套接字](https://en.wikipedia.org/wiki/Raw_socket)或[用户空间网络](https://www.google.com/search?q=user +空格+网络)。 –

+0

@SteffenUllrich我已经知道原始插座,但仍然使用插座,对吧?我会看看这个用户空间网络。 –

+0

*“但仍然使用套接字”* - 是的,它仍然是一个文件描述符,您可以在其中读写。但是,像你提出的那样访问'/ dev/eth0'就意味着你有一个文件描述符可以读写。只有你现在不仅能够做所有事情,还需要做所有事情,包括确保没有其他应用程序推断你直接使用网卡。这就是用户空间网络实质上所做的:一个进程(并且只有一个进程)完全控制网卡,而不是内核完全控制。 –

回答

1

你不能直接打开/dev/eth0,因为如果你尝试过,可能是明显的一个原因:

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

设备根本没有在文件系统为代表的网络的方式与其它硬件设备(如磁盘和串行线)是。

你可以做些什么,正如在评论中指出的那样,是使用原始套接字。原始套接字允许你做你想做的事情:发送完全形成的数据包,内核将按原样输出,而不以任何方式进行修改(TCP校验和卸载不承担责任)。

如果你希望有另一个方向,即 - 有内核对待你的文件描述符,就好像它是一个网络设备,可以使用自来水/桶接口/dev/net/tun。这允许你创建一个内核对待的接口,就好像它是一个实际的以太网设备,它控制着什么被“接收”,而内核让你知道它发送了什么。

相关问题