2012-04-12 254 views
5

我想編寫一個程序並在兩臺機器上運行它,並在一個以太網幀中將一些數據從一臺機器發送到另一臺機器。我可以使用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

回答

7

正如你已經提到的插座,也許你只是想使用原始套接字。也許這個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

相關問題