6

我想编写一个程序并在两台机器上运行它,并在以太网帧中将一些数据从一台机器发送到另一台机器。

通常,应用程序数据位于 OSI 模型的第 7 层,是否存在内核限制或 API 限制之类的东西,这会阻止我编写可以指定目标 MAC 地址并将一些数据发送到该 MAC 的程序作为以太网有效载荷?然后编写一个程序来监听传入的帧,并从指定的源 MAC 地址抓取帧,从帧中提取数据的有效载荷?

(所以我不想要任何其他开销,如 IP 或 TCP/UDP 标头,我不想高于第 2 层)。

这可以在 C++ 中完成,还是必须在 IP 层进行所有通信,这可以在 Ubuntu 上完成吗?额外的爱指向或提供示例!:D

我的问题显然是我是 C++ 网络编程的新手,据我所知,如果我想通过网络进行通信,我必须使用socket()调用或类似的方法,它在 IP 层工作,所以我可以写一个 C++程序在 OSI 第 2 层工作,是否有用于此的 API,Linux 内核甚至允许这样做吗?

4

2 回答 2

8

正如您已经提到的套接字,您可能只想使用原始套接字。也许这个带有 C 示例代码的页面会有所帮助。


如果您正在寻找仅使用以太网但仍然有用的程序的想法:

原始形式的LAN 唤醒非常简单。但是请注意,大多数当前实现实际上发送 UDP 数据包(利用接收器不解析数据包头等,而只是数据包有效负载中的一个字符串)。


此外,原始套接字的使用通常仅限于特权用户。您可能需要

  • 以 root 身份调用您的程序
  • 或将其归 root 所有并设置 setuid 位
  • 或设置使用创建原始套接字的能力setcap CAP_NET_RAW+ep /path/to/your/program-file

最后一个选项提供了比其他两个更细粒度的权限(只是原始套接字,而不是对整个文件系统的写访问等)。然而,它仍然鲜为人知,因为它“仅”从内核 2.6.24 开始支持(Ubuntu 8.04 附带)。

于 2012-04-12T23:38:17.303 回答
5

是的,实际上 linux 有一个非常好的功能,可以轻松处理第 2 层数据包。您可以使用 TAP 设备,它允许您的用户空间程序通过内核读取/写入以太网流量。

http://www.kernel.org/pub/linux/kernel/people/marcelo/linux-2.4/Documentation/networking/tuntap.txt

http://en.wikipedia.org/wiki/TUN/TAP

于 2012-04-12T21:37:27.660 回答