【问题标题】:Raw socket implementation in windows?Windows中的原始套接字实现?
【发布时间】:2010-10-08 01:51:25
【问题描述】:

我需要为我的应用程序手动创建 TCP/IP 标头。为此,我使用了原始套接字。我的系统操作系统是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。我做错了什么?我也关闭了防火墙,但仍然得到相同的结果。

【问题讨论】:

    标签: c++ sockets tcp


    【解决方案1】:
    【解决方案2】:

    我建议为此使用WinPcap。即使您知道如何使用 win32 API 正确执行此操作,它也会非常缓慢。

    我已成功使用 WinPcap 以硬件可以处理的速度将数据包注入千兆以太网端口。

    【讨论】:

      【解决方案3】:

      不是答案,但希望是一个开始......

      来自MSDN

      WSAEINVAL 10022 参数无效。 提供了一些无效的参数 (例如,指定一个无效的 水平到 setsockopt 功能)。在 在某些情况下,它还指 套接字的当前状态——对于 例如,在套接字上调用接受 那不是在听。

      您的 send 调用的参数是什么?


      我发现 this 更新原始套接字:

      在带有 Service Pack 2 的 Windows XP 上 (SP2) 和 Windows Vista 的能力 通过原始套接字发送流量有 在几个方面受到限制:

      • 无法通过原始套接字发送 TCP 数据。

      不确定这是否适用于 XP SP3...

      【讨论】:

      • sendto(s , buf , sizeof(IPV4_HDR)+sizeof(TCP_HDR) + payload, 0,(SOCKADDR *)&dest, sizeof(dest)))
      • 你在尝试发送 TCP 数据吗?
      • (我猜是因为你有一个 TCP 标头) - 请参阅我的更新来回答。
      【解决方案4】:

      微软限制了 RAWSockets,但只使用 WinPcap http://www.winpcap.org/ 。 这样你就可以发送各种数据包了。

      【讨论】:

        猜你喜欢
        • 2012-01-19
        • 2018-12-02
        • 2021-02-25
        • 1970-01-01
        • 2017-02-16
        • 2011-09-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多