c# - Socket.IOControl - 不明确的文档

标签 c# .net socket.io

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

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 ,但是真的很暧昧。

问题:

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

最佳答案

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

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

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

IOControlCode Enumeration @ MSDN

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

根据 IOControlCode.ReceiveAll 的文档:

Enable receiving all IPv4 packets on the network. The socket must have address family InterNetwork, the socket type must be Raw, and the protocol type must be IP. The current user must belong to the Administrators group on the local computer, and the socket must be bound to a specific port. This control code is supported on Windows 2000 and later operating systems. This value is equal to the Winsock 2 SIO_RCVALL constant.

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

SIO_RCVALL control code @ MSDN

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

您应该用手头的 C 头文件仔细检查这一点,但是 wine(Windows 模拟器)的接口(interface)兼容副本表明模式 RCVALL_ON 的值是 1。 .NET 方法应该为您包装管理数组大小的细节,因此您遇到的代码片段试图为套接字启用 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

关于c# - Socket.IOControl - 不明确的文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9440130/

相关文章:

c# - 慢 SoapHttpClientProtocol 构造函数

c# - .NET 和 Silverlight 之间共享代码的可行性?

c# - 如何在每3位数字后向左插入一个逗号并显示2位小数

C# - 通过 https 使用 REST Web 服务

c# - DateTime.Now 在 PST 服务器上表示为 GMT 时间

php - 验证 socket.io/nodejs 的用户

ruby-on-rails - Ruby Socket-通过Socker运行方法

c# - 在 LINQ 中重用连接

c# - 为什么单个循环会导致内存泄漏?

javascript - 一次加入多个房间 Socket.io