2017-09-16 83 views
0

我最近玩的Linux和Windows上的套接字接口在同一網絡上的機器之間發送TCP和UDP數據包。通常,這是通過一些套接字結構完成的,方法是打開,寫入數據,讀取數據並在完成時關閉它。什麼是最低級別的方式發送數據到設備/ dev/eth0(或類似)與c/c + +

有沒有辦法做到這一點,沒有這種套接字結構?我的意思是,如果我使用它,這個結構將我傳遞給它的數據包裝在協議頭文件中並通過網絡發送。

如果我手動創建協議數據包和數據報,我可以使用類似於cat file.txt > /dev/etho(或/dev/wlp5s0在我的情況),但使用c/C++發送數據到網絡上的另一臺機器?

+1

您可以查看[原始套接字](https://en.wikipedia.org/wiki/Raw_socket)或[用戶空間網絡](https://www.google.com/search?q=user +空格+網絡)。 –

+0

@SteffenUllrich我已經知道原始插座,但仍然使用插座,對吧?我會看看這個用戶空間網絡。 –

+0

*「但仍然使用套接字」* - 是的,它仍然是一個文件描述符,您可以在其中讀寫。但是,像你提出的那樣訪問'/ dev/eth0'就意味着你有一個文件描述符可以讀寫。只有你現在不僅能夠做所有事情,還需要做所有事情,包括確保沒有其他應用程序推斷你直接使用網卡。這就是用戶空間網絡實質上所做的:一個進程(並且只有一個進程)完全控制網卡,而不是內核完全控制。 –

回答

1

你不能直接打開/dev/eth0,因爲如果你嘗試過,可能是明顯的一個原因:

$ cat /dev/eth0 
cat: /dev/eth0: No such file or directory 

設備根本沒有在文件系統爲代表的網絡的方式與其它硬件設備(如磁盤和串行線)是。

你可以做些什麼,正如在評論中指出的那樣,是使用原始套接字。原始套接字允許你做你想做的事情:發送完全形成的數據包,內核將按原樣輸出,而不以任何方式進行修改(TCP校驗和卸載不承擔責任)。

如果你希望有另一個方向,即 - 有內核對待你的文件描述符,就好像它是一個網絡設備,可以使用自來水/桶接口/dev/net/tun。這允許你創建一個內核對待的接口,就好像它是一個實際的以太網設備,它控制着什麼被「接收」,而內核讓你知道它發送了什麼。

相關問題