当我打开原始套接字是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()失败
回答
FreeBSD采取另一种方法。它从不将TCP或UDP数据包传递给原始的 套接字。这些数据包需要通过使用libpcap或bpf API等库来直接在数据链路层读取。它也从来没有通过任何片段 数据报。每个数据报必须在通过 传递到原始套接字之前重新汇编。
这可能去OSX以及
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>
希望这有助于。
我可能已经解开了这个谜。 我也制作了一个原始套接字的例子,它在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.它的工作原理,但它是奇怪的。
该行为实际记录在Steven的“Unix网络编程”第I卷第25章“Raw socket”第2版中。 – 2017-06-15 06:38:07
就是这样。你救了我,谢谢! – 2017-08-18 17:08:30
- 1. 在Linux上使用C的原始套接字sendto失败
- 2. 使用sendto失败的UDP套接字
- 3. XOpenDisplay在OS X中失败
- 4. 原始套接字:sendto()和recvfrom()不工作
- 5. CouchDB在OS X上失败
- 6. 套接字连接失败
- 7. 套接字UDP:使用来自SendTo()中的Recvfrom()的发件人信息失败
- 8. recv与原始套接字
- 9. 使用原始套接字
- 10. UDP - 原始套接字 - C#
- 11. 套接字失败检测
- 12. mysql套接字路径os x
- 13. Python中的QDISC_BYPASS(原始套接字)
- 14. Haskell中的原始套接字
- 15. winpcap/libpcap与原始套接字
- 16. java中的原始套接字
- 17. libusb_claim_interface在Mac OS X上失败Mountain Lion
- 18. 在os上安装pcapy失败x
- 19. Neovim在OS X上编译失败10.10.2
- 20. Virtualenv在OS X Yosemite OSError上失败
- 21. Python原始套接字接收问题
- 22. 奇怪UDP套接字SENDTO行为
- 23. 套接字sendto投掷Errno-101
- 24. Sequel Pro - 套接字连接失败
- 25. 套接字重新连接失败
- 26. 在Mac OS X中访问unix域套接字
- 27. 原始套接字编程UDP Python
- 28. 单点触摸的原始套接字
- 29. 原始套接字需要root权限
- 30. 在pthreads原始套接字中接收数据包
这是一个很好的问题,但它真的会从程序员那里得到更好的答案。出于这个原因,我正在投票迁移到http://www.stackoverflow.com。一旦有更多的人投票,它会自动发生,所以你不需要在那里重新创建它。 – 2010-03-12 08:55:21