c++ - 我可以用 C++ 编写基于以太网的网络程序吗?

标签 c++ linux sockets ethernet

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

通常应用程序数据位于 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/

相关文章:

c - 从文件读取 - 段错误(核心转储)

java - 无法捕获从 socket.connect(InetAddress, timeout) 抛出的 SocketTimeoutException

android套接字文件传输

c++ - 自动返回类型扣除警告 : why do we need decltype when return defines the type anyway?

c# - 如何通过 DllImport 将 double 组从 C# 传递到 C++

c++ - vector 2D 删除元素并保持字段为空

c++ - 在 C++ : strange performance issue 中读取文件的奇特方式

c - 如何强制正在运行的程序使用外部方式将其 I/O 缓冲区的内容刷新到磁盘?

linux - 如何在 sed 中使用单引号和双引号变量

c - 多个客户端未连接且无法同时通信