簡體   English   中英

OS X中的原始套接字sendto()失敗

[英]Raw socket sendto() failure in OS X

當我打開一個原始套接字是OS X,構建我自己的udp數據包(標頭和數據),並調用sendto(),我得到錯誤“無效的參數”。 以下是來自網站http://www.tenouk.com/Module43a.html的示例程序“rawudp.c”,它演示了此問題。 該程序(在添加字符串和stdlib #includes之后)在Fedora 10下運行但在OS X下失敗並顯示“無效參數”。任何人都可以建議為什么在OS X中失敗? 我看了看,看了看sendto()調用,但所有參數看起來都不錯。 我正在以root身份運行代碼,等等。是否有內核設置阻止甚至uid 0可執行文件通過OS X Snow Leopard中的原始套接字發送數據包? 謝謝。

我可能已經解開了這個謎團。 我也制作了一個原始套接字示例,它在Linux上運行良好,但在OS X 10.6上出現“無效參數”錯誤。
在谷歌上搜索答案時,我遇到了這個頁面“ FreeBSD socket bug and specialclicarities ”。 它說:

寫入RAW套接字


- ip_len和ip_off必須按主機字節順序排列

所以我更換

ip.ip_len = htons(len);

ip.ip_len = len;

在OS X上。它的工作原理有點奇怪。

user37278,我在Mac OS X(Snow Leopard)上運行了相同的程序,並得到相同的錯誤消息。 我發現問題是自定義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>

希望這可以幫助。

FreeBSD采取了另一種方法。 永遠不會將TCP或UDP數據包傳遞給原始套接字。 需要使用libpcap或bpf API等庫直接在數據鏈路層讀取此類數據包。 它也從不傳遞任何碎片數據報。 每個數據報在傳遞給原始套接字之前必須重新組裝。

這也可能適用於OSX

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

暫無
暫無

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

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