我需要为我的应用程序手动创建TCP / IP标头。为此,我使用Raw套接字。我的系统os是win xp(SP3)。
我的代码编译得很好但是它会引发运行时错误:
Initialising Winsock...Initialised successfully. Creating Raw TCP Socket...Raw TCP Socket Created successfully. Setting the socket in RAW mode...Successful. Enter hostname : 192.168.1.152
Resolving Hostname...Resolved. Enter Source IP : 192.168.1.151
Sending packet... Error sending Packet : 10022
我已将IP_HDRINCL设置为1.我做错了什么?我也关闭了防火墙,但仍然得到了相同的结果。
答案 0 :(得分:8)
从Windows XP SP2开始,Microsoft有意禁用原始套接字。
答案 1 :(得分:2)
不是答案,但希望是一个开始...
来自MSDN:
WSAEINVAL 10022参数无效。 提供了一些无效的参数 (例如,指定无效 levelock到setsockopt函数)。在 在某些情况下,它也指的是 socket-for的当前状态 例如,在套接字上调用accept 那不是在听。
您的发送电话有哪些参数?
我在原始套接字上发现this更新:
在带有Service Pack 2的Windows XP上 (SP2)和Windows Vista的能力 通过原始套接字发送流量了 受到多种限制:
- 无法通过原始套接字发送TCP数据。
不确定这是否适用于XP SP3但是......
答案 2 :(得分:2)
我建议将WinPcap用于此目的。即使你弄清楚如何使用win32 API正确地做到这一点,它也会非常缓慢。
我已成功使用WinPcap将数据包注入千兆以太网端口,速度与硬件可以处理的速度一样快。
答案 3 :(得分:2)
Microsoft已限制RAWSockets,但只使用WinPcap http://www.winpcap.org/。 有了这个,你可以发送所有类型的数据包。