2010-03-12 44 views
2

當我打開原始套接字是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()失敗

+0

這是一個很好的問題,但它真的會從程序員那裏得到更好的答案。出於這個原因,我正在投票遷移到http://www.stackoverflow.com。一旦有更多的人投票,它會自動發生,所以你不需要在那裏重新創建它。 – 2010-03-12 08:55:21

回答

0

FreeBSD採取另一種方法。它從不將TCP或UDP數據包傳遞給原始的 套接字。這些數據包需要通過使用libpcap或bpf API等庫來直接在數據鏈路層讀取。它也從來沒有通過任何片段 數據報。每個數據報必須在通過 傳遞到原始套接字之前重新彙編。

這可能去OSX以及

來源: http://sock-raw.org/papers/sock_raw

2

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>

希望這有助於。

4

我可能已經解開了這個謎。 我也製作了一個原始套接字的例子,它在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.它的工作原理,但它是奇怪的。

+0

該行爲實際記錄在Steven的「Unix網絡編程」第I卷第25章「Raw socket」第2版中。 – 2017-06-15 06:38:07

+0

就是這樣。你救了我,謝謝! – 2017-08-18 17:08:30