當我打開原始套接字是OS X時,構建自己的udp數據包(頭文件和數據)並調用sendto()時,出現錯誤「Invalid Argument」。這是一個示例程序「rawudp.c」,來自網站http://www.tenouk.com/Module43a.html,它演示了這個問題。該程序(添加字符串和stdlib #includes後)在Fedora 10下運行,但在OS X下失敗並顯示「Invalid Argument」。任何人都可以提出爲什麼在OS X中失敗?我看了看,看着sendto()調用,但所有的參數看起來不錯。我以root身份運行代碼等。是否有內核設置可以防止即使uid 0可執行文件通過OS X Snow Leopard中的原始套接字發送數據包?謝謝。在OS X中原始套接字sendto()失敗
回答
FreeBSD採取另一種方法。它從不將TCP或UDP數據包傳遞給原始的 套接字。這些數據包需要通過使用libpcap或bpf API等庫來直接在數據鏈路層讀取。它也從來沒有通過任何片段 數據報。每個數據報必須在通過 傳遞到原始套接字之前重新彙編。
這可能去OSX以及
user37278,我跑在我的Mac OS X(雪豹)相同的程序,並得到同樣的錯誤消息。我發現問題是自定義IP頭結構與IP頭格式不一致。 (可能在機器上有所不同......我不確定)。
我所做的是我刪除了自定義IP頭結構,並使用了Mac OS X附帶的IP頭結構。頭文件信息在<netinet/ip.h>
中定義,結構爲struct ip
。我還發現了另一個名爲struct iphdr
的結構,我不確定區別。
我包括標頭是<netinet/ip.h> <netinet/udp.h> <netinet/in.h> <arpa/inet.h>
希望這有助於。
我可能已經解開了這個謎。 我也製作了一個原始套接字的例子,它在Linux上運行良好,但在OS X 10.6上出現「Invalid Argument」錯誤。
我在搜索答案時遇到了此頁「FreeBSD socket bugs and peculiarities」。它說:
寫入RAW插槽
- ip_len和ip_off必須在主機字節順序
所以我代替
ip.ip_len = htons(len);
與
ip.ip_len = len;
在OS X.它的工作原理,但它是奇怪的。
該行爲實際記錄在Steven的「Unix網絡編程」第I卷第25章「Raw socket」第2版中。 – 2017-06-15 06:38:07
就是這樣。你救了我,謝謝! – 2017-08-18 17:08:30
- 1. 在Linux上使用C的原始套接字sendto失敗
- 2. 使用sendto失敗的UDP套接字
- 3. sendto失敗UNIX域套接字
- 4. C - Sendto()中的UDP套接字發送失敗:無效參數
- 5. XOpenDisplay在OS X中失敗
- 6. 原始套接字:sendto()和recvfrom()不工作
- 7. 接收來自原始套接字失敗
- 8. 使用原始套接字的c ping請求失敗
- 9. CouchDB在OS X上失敗
- 10. sendto()「無效參數」錯誤在Linux上的原始udp套接字
- 11. 廣播sendto失敗
- 12. 套接字連接失敗
- 13. 套接字連接失敗
- 14. 套接字UDP:使用來自SendTo()中的Recvfrom()的發件人信息失敗
- 15. sendto在Mac OS X上返回EINVAL 10.8
- 16. Lua:原始套接字
- 17. recv與原始套接字
- 18. 使用原始套接字
- 19. UDP - 原始套接字 - C#
- 20. Scapy的原始套接字
- 21. 更改套接字sendto()中的源IP
- 22. sendto()到不存在的套接字
- 23. 套接字失敗檢測
- 24. Android的套接字失敗
- 25. 套接字通信失敗
- 26. OS X通過套接字啓動
- 27. mysql套接字路徑os x
- 28. Python中的QDISC_BYPASS(原始套接字)
- 29. Haskell中的原始套接字
- 30. python3中的原始套接字
這是一個很好的問題,但它真的會從程序員那裏得到更好的答案。出於這個原因,我正在投票遷移到http://www.stackoverflow.com。一旦有更多的人投票,它會自動發生,所以你不需要在那裏重新創建它。 – 2010-03-12 08:55:21