Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets OS X中的原始套接字sendto()失败_Sockets_Macos - Fatal编程技术网

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

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等身份运行代码。是否有内核设置阻止

当我打开一个原始套接字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

资料来源:

用户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;