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

时间:2012-04-12 20:48:30

标签: c++ linux sockets ethernet

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

典型地应用数据是在OSI模型的层7,是有像一个内核限制或API限制任何东西,会从编写程序中,我可以指定一个目的地MAC地址阻止我并具有发送到某些数据MAC作为以太网有效载荷?然后写一个程序来监听传入的帧并从指定的源MAC地址中获取帧,从帧中提取数据的有效载荷?

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

这可以用C ++完成,还是必须在IP层进行所有通信,这可以在Ubuntu上完成吗?特别喜欢指点或提供示例! :d

我的问题是很明显,我是新来的网络在C ++编程而据我所知,如果我想在网络上进行沟通我必须使用socket()来电或类似的,其在IP工作层,所以我可以编写一个c ++程序在OSI第2层工作,是否有API,Linux内核是否允许这样做?

2 个答案:

答案 0 :(得分:8)

正如您已经提到的套接字,可能您只想使用原始套接字。也许这page with C example code会有所帮助。


如果您正在寻找仅使用以太网的程序,同时仍然有用:

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


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

  • 以root身份调用您的程序
  • 或者拥有root和setuid位设置
  • 或使用setcap CAP_NET_RAW+ep /path/to/your/program-file
  • 设置创建原始套接字的功能

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

答案 1 :(得分: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