当我打开一个原始套接字是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上.它的工作原理有点奇怪.