Sockets OS X中的原始套接字sendto()失败
当我打开一个原始套接字is OS X,构造我自己的udp数据包(头和数据),并调用sendto()时,我得到错误“Invalid Argument”。下面是一个来自web站点的示例程序“rawudp.c”,它演示了这个问题。该程序(在添加字符串和stdlib#includes后)在Fedora 10下运行,但在OS X下因“无效参数”而失败。有人能解释一下为什么在OS X中会失败吗?我看了又看,看了又看,sendto()调用,但所有参数看起来都不错。我以root等身份运行代码。是否有内核设置阻止uid0可执行文件通过osxsnowleopard中的原始套接字发送数据包?谢谢。FreeBSD采用了另一种方法。它从不将TCP或UDP数据包传递给原始数据 插座。这样的数据包需要在数据链路层通过使用 libpcap或bpfapi之类的库。它也从不通过任何零碎的测试 数据报。每个数据报在传递之前必须完全重新组装 到原始插座 这可能也适用于OSX 资料来源:Sockets OS X中的原始套接字sendto()失败,sockets,macos,Sockets,Macos,当我打开一个原始套接字is OS X,构造我自己的udp数据包(头和数据),并调用sendto()时,我得到错误“Invalid Argument”。下面是一个来自web站点的示例程序“rawudp.c”,它演示了这个问题。该程序(在添加字符串和stdlib#includes后)在Fedora 10下运行,但在OS X下因“无效参数”而失败。有人能解释一下为什么在OS X中会失败吗?我看了又看,看了又看,sendto()调用,但所有参数看起来都不错。我以root等身份运行代码。是否有内核设置阻止
用户37278,我在Mac OS X(雪豹)上运行了相同的程序,得到了相同的错误消息。我发现问题在于自定义IP头结构与IP头格式不一致。(可能与机器的不同有关……我不确定) 我所做的是删除了他的自定义IP头结构,并使用Mac OS X附带的IP头结构。头信息在
中定义,结构是结构IP
。我还发现了另一个名为struct iphdr
的结构,我不确定两者的区别
我包括的标题是
希望这有帮助。我可能已经解开了这个谜。 我也制作了一个原始套接字示例,它在Linux上运行良好,但在OS X 10.6上出现“无效参数”错误。
我在谷歌搜索答案时遇到了这个页面“”。上面写着: 写入原始套接字
-ip_len和ip_off必须按主机字节顺序排列 所以我换了
ip.ip_len = htons(len);
与
这是一个好问题,但它确实会从程序员那里得到更好的答案。出于这个原因,我投票将其迁移到。一旦有更多的人投票,它就会自动发生,因此您不需要在那里重新创建它。这种行为实际上记录在Steven的《Unix网络编程》第一卷第25章“原始套接字”第二版中。
ip.ip_len = len;