繁体   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