我想编写一个程序并在两台机器上运行,并通过以太网帧将一些数据从一台机器发送到另一台机器。
通常应用程序数据位于 OSI 模型的第 7 层,是否存在内核限制或 API 限制之类的东西,这会阻止我编写一个程序,在该程序中我可以指定目标 MAC 地址并将一些数据发送到该地址MAC 作为以太网负载?然后编写一个程序来监听传入的帧并从指定的源 MAC 地址抓取帧,从帧中提取数据的有效负载?
(所以我不想要任何其他开销,例如 IP 或 TCP/UDP header ,我不想高于第 2 层)。
这可以用 C++ 完成吗,或者所有通信都必须在 IP 层发生,这可以在 Ubuntu 上完成吗?特别喜欢指点或提供例子! :D
我的问题显然是我是 c++ 网络编程的新手,据我所知,如果我想通过网络进行通信,我必须使用 socket()
调用或类似的调用,它在 IP 层工作,所以我可以编写一个 c++ 程序在 OSI 第 2 层工作吗,是否有用于此的 API,Linux 内核甚至允许这样做吗?
最佳答案
正如您已经提到的套接字,您可能只想使用原始套接字。也许这个page with C example code有一定的帮助。
如果您正在寻找仅使用以太网但仍然有用的程序的想法:
Wake on LAN它的原始形式非常简单。但是请注意,大多数当前实现实际上发送 UDP 数据包(利用接收器不解析数据包 header 等,而只是数据包有效负载中的字符串)。
此外,原始套接字的使用通常仅限于特权用户。您可能需要要么
- 以root身份调用你的程序
- 或将其归 root 并设置 setuid 位
- 或使用
setcap CAP_NET_RAW+ep/path/to/your/program-file
设置创建原始套接字的能力
最后一个选项比其他两个提供了更细粒度的权限(只是原始套接字,而不是对整个文件系统的写访问等)。然而,它仍然鲜为人知,因为它“仅”受内核 2.6.24(Ubuntu 8.04 附带)的支持。
关于c++ - 我可以用 C++ 编写基于以太网的网络程序吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10131572/