【问题标题】:Socket.IOControl - Ambiguous DocumentationSocket.IOControl - 不明确的文档
【发布时间】:2012-02-25 00:55:07
【问题描述】:

我第一次尝试以如此低级的方式控制套接字
浏览教程时,我遇到了这些问题:

byte[] byTrue = new byte [4] {1, 0, 0, 0};
byte[] byOut = new byte [4] {1, 0, 0, 0};

_Socket.IOControl(IOControlCode.ReceiveAll, byTrue, byOut);  

我提到了MSDN documentation,但是真的很模棱两可。

问题:

这 2 个字节的数组是什么?它们的用途是什么?
文档说 OPTIONS - 什么选项?

【问题讨论】:

    标签: c# .net socket.io


    【解决方案1】:

    Socket.IOControl() 的字节数组参数特定于指定为第一个参数的 IOControlCode

    第一个数组用于输入数据,第二个数组用于输出数据。

    要查找有关这些数组的特定布局的更多信息,从查看枚举开始会很有帮助,它为您列出了所有可能的操作。从那里,您应该交叉引用为 Socket.IOControl() 包装的 C 可操作函数列出的文档。它们是WSAIoctl()ioctlsocket()

    IOControlCode Enumeration @ MSDN

    WSAIoctl() function @ MSDN
    ioctlsocket() function @ MSDN

    根据IOControlCode.ReceiveAll 的文档:

    启用接收网络上的所有 IPv4 数据包。插座必须有 地址族 InterNetwork,套接字类型必须是 Raw,并且 协议类型必须是 IP。当前用户必须属于 本地计算机上的管理员组,并且套接字必须是 绑定到特定端口。 Windows 支持此控制代码 2000 及更高版本的操作系统。这个值等于 Winsock 2 SIO_RCVALL 常量。

    交叉引用SIO_RCVALL,我们发现它在winsock文档中有一个条目。

    SIO_RCVALL control code @ MSDN

    通读这个条目,它提到输入缓冲区需要选择一种操作模式,最小大小对应于RCVALL_VALUE。在您的语句中,您在输入参数数组中传递值1。我们可以检查头文件,看看这应该是什么意思。

    您应该仔细检查手头的 C 头文件,但 wine(Windows 模拟器)的接口兼容副本显示模式 RCVALL_ON 的值是 1。 .NET 方法应该为您包装管理数组大小的详细信息,因此您遇到的代码 sn-p 正在尝试为套接字启用 RCVALL_ON

    这里是 winehq.org 上 C 头文件的链接: mstcpip.h at winehq.org

    如果您已经为 Visual Studio 安装了 C/C++ 支持,您可能能够在类似于以下路径的本地找到 mstcpip.h 和 winsock2.h:

    C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Include\
    

    我的副本说:

    //
    // Values for use with SIO_RCVALL* options
    //
    typedef enum {
        RCVALL_OFF             = 0,
        RCVALL_ON              = 1,
        RCVALL_SOCKETLEVELONLY = 2,
        RCVALL_IPLEVEL         = 3,
    } RCVALL_VALUE, *PRCVALL_VALUE;
    

    我找不到任何文档明确说明应该使用什么大小的字节数组来传递RCVALL_VALUE,但是如果您查看IOControl() 的示例,他们使用BitConverter.GetBytes(0) 作为默认参数大小为 4 个字节(对应于 .NET int)并与您的示例匹配。这足够大,也可以在 C 操作中容纳 RCVALL_VALUE

    【讨论】:

    • 感谢您提供详细有用的评论,但是“byOut”数组呢?
    • byOut 指定的参数槽用于接收从所选 IOControl 功能返回的数据。在 SIO_RCVALL 的情况下,不需要特殊的返回数据(请参阅 SIO_RCVALL 链接上的 lpvOutBuffer 注释)。您可能能够传递一个空数组,甚至可能是 null。
    【解决方案2】:

    第一个数组应该包含你要写入的字节——数据将被发送—— 第二个数组将包含接收操作完成后的输出数据。 因此,根据 IOControlCode 操作,您将两个参数之一设置为 null。

    【讨论】:

      猜你喜欢
      • 2012-11-12
      • 2017-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多