簡體   English   中英

如何在不考慮MAC地址的情況下使用packet_mmap發送SOCK_DGRAM數據包?

[英]How to send SOCK_DGRAM packet using packet_mmap without being concerned about MAC address?

我想使用packet_mmap發送數據包以獲得更高的數據包傳輸速率。 我設法以原始模式使用數據包套接字發送數據包,為此,我在緩沖區中創建了L2,L3等,並使用

sendto(fd_socket, NULL, 0, 0, NULL, sizeof(struct sockaddr_ll));

但是,我不想打擾目標mac地址。 因此我轉而使用Dgram。 如果我想使用sendto,則有一個目標MAC地址的參數。 即使這不是我所希望的,而不是擔心arp緩存並指定目標的MAC地址:

sendto(fd_socket, NULL, 0, 0, (struct sockaddr *) ps_sockaddr, sizeof(struct sockaddr_ll));

但是我發現send也可以與數據包套接字一起使用。 http://man7.org/linux/man-pages/man7/packet.7.html因此,我用ip標頭填充了緩沖區,依此類推。 在這種情況下,send返回零,因為沒有發現要發送的內容,如果數據包傳輸出現錯誤,我希望不是零。

有沒有一種方法可以使用packet_mmap而不關心L2地址?

否。在SOCK_DGRAM模式下使用數據包套接字時,不需要構造L2頭,但是仍然必須提供L2地址,然后系統將為您構造頭。 (因此,這將為您實際構建數據包的L2部分帶來好處,您無需指定源MAC地址,但仍需要指定要從其發送數據包的接口和目標MAC地址。)

系統如何知道否則將數據包發送到哪里? 我相信您希望系統會查看已經在數據包緩沖區中構建的IP標頭,然后代表您執行接口選擇和ARP查找,但是通過使用數據包套接字,您可以繞過該部分網絡堆棧。 (此外,如果IP地址不在本地LAN上,則需要執行路由步驟-通常只是查找默認網關並為其 MAC地址進行ARPing。)

現在,您可以使用raw套接字( http://man7.org/linux/man-pages/man7/raw.7.html )獲得所需的大部分(我認為)。 在這種情況下,您要告訴內核您正在使用IP,但不依賴任何高層(> L3)。 在這種情況下,您還可以構造自己的IP標頭,並使用IP_HDRINCL選項基於該標頭做出路由決策。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM