Windows中的原始套接字实现?

时间:2009-02-17 12:07:15

标签: c++ sockets tcp

我需要为我的应用程序手动创建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.我做错了什么?我也关闭了防火墙,但仍然得到了相同的结果。

4 个答案:

答案 0 :(得分:8)

答案 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/。 有了这个,你可以发送所有类型的数据包。