Socket.IOControl - 模糊文档

Ahm*_*eim 9 .net c# 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);  
Run Code Online (Sandbox Code Playgroud)

我提到了MSDN文档,但它确实很模糊.

题:

这两个字节的数组是什么?他们用的是什么?
文档说OPTIONS - 有哪些选择?

mek*_*ian 9

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

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

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

IOControlCode Enumeration @ MSDN

WSAIoctl()函数@ MSDN
ioctlsocket()函数@ MSDN

根据以下文档IOControlCode.ReceiveAll:

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

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

SIO_RCVALL控制代码@ MSDN

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

你应该用手头的C头文件仔细检查一下,但是wine的界面兼容副本(windows模拟器)说模式的值RCVALL_ON1..NET方法应该包含管理数组大小的详细信息,因此您遇到的代码片段正在尝试RCVALL_ON为套接字启用.

以下是winehq.org上的C头文件的链接:winehq.org上的 mstcpip.h

如果您已经为visual studio安装了C/C++支持,那么您可以在类似于以下的路径中在本地找到mstcpip.h和winsock2.h:

C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Include\
Run Code Online (Sandbox Code Playgroud)

我的副本说:

//
// 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;
Run Code Online (Sandbox Code Playgroud)

我找不到任何专门说明应该使用什么大小的字节数组来传递a的文档RCVALL_VALUE,但是如果查看示例IOControl(),它们会BitConverter.GetBytes(0)用于默认参数,其大小为4个字节(对应于.NET) int)并匹配您的示例.这足够大以适应RCVALL_VALUEC操作.