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

问题描述:

我想编写一个程序并在两台机器上运行它,并在一个以太网帧中将一些数据从一台机器发送到另一台机器。我可以使用C++编写基于以太网的网络程序吗?

通常,应用程序数据位于OSI模型的第7层,是否有任何内核限制或API限制,这会阻止我编写一个程序,在该程序中可以指定目标MAC地址并将一些数据发送给该MAC作为以太网有效载荷?然后编写一个程序来侦听传入的帧并从指定的源MAC地址获取帧,从帧中提取数据的有效载荷? (所以我不希望任何其他开销像IP或TCP/UDP标头,我不想比第2层更高)。

这可以用C++来完成,还是所有的通信都需要在IP层完成,而且可以在Ubuntu上完成?额外的爱指点或提供的例子! :D

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

+1

C++是一种编程语言,IP层是一个抽象的概念。在你的文本中替换另一个的方式是如何超越我的。 – littleadv 2012-04-12 20:52:54

+5

@littleadv:为什么?他不知道要问什么(“我如何在C++中使用原始套接字?”),但您可以完美地理解其含义。 – cha0site 2012-04-12 20:54:32

+3

从理论上讲,C++应该不会出现问题,但是OS支持可能会限制你。虽然UDP的开销很小,但请使用它。 – 2012-04-12 20:55:13

正如你已经提到的插座,也许你只是想使用原始套接字。也许这个page with C example code有一些帮助。


如果你正在寻找一个想法只使用以太网,同时仍然是有用的程序:

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


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

  • 打电话给你的程序作为根
  • 还是有它属于root和setuid位设置
  • 或将功能设置为创建使用setcap CAP_NET_RAW+ep /path/to/your/program-file

最后一个原始套接字选项提供更多细粒度权限(只是原始套接字,而不是写入整个文件系统的权限等)。然而,它还没有广为人知,因为它是“仅”从内核2.6.24开始支持的(随Ubuntu 8.04发布)。

+0

感谢您的输入以及代码示例的链接。这已经清理了很多东西:) – jwbensley 2012-04-13 20:43:51

+0

很高兴我可以帮助:) – zpea 2012-04-13 21:02:59

是的,实际上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