2010-03-12 105 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