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

C# Socket.IOControl-不明确的文档,c#,.net,socket.io,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); 我提到了这个问题,但它确实很含糊 问题: 这两个字节的数组是什么?它们用在什么地方? 文档中说选项-什么选项?第一个数组应该包含您

我第一次尝试用这种低级别的方式控制套接字
在本教程中,我面对以下几行:

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

_Socket.IOControl(IOControlCode.ReceiveAll, byTrue, byOut);  
我提到了这个问题,但它确实很含糊

问题:

这两个字节的数组是什么?它们用在什么地方?

文档中说选项-什么选项?

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

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

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

要查找有关这些数组的特定布局的更多信息,请先查看枚举,它列出了所有可能的操作。从这里开始,您应该交叉参考为C操作函数列出的文档,这些函数
Socket.IOControl()
wrapps。它们是
WSAIoctl()
ioctlsocket()


根据
IOControlCode.ReceiveAll的文档:

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

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

通过阅读此条目,它提到需要输入缓冲区来选择操作模式,最小大小对应于
RCVALL_值
。在语句中,您正在输入参数数组中传递值
1
。我们可以检查头文件,看看这意味着什么

您应该使用手头的C头文件再次检查这一点,但是与wine接口兼容的副本(windows emulator)说,mode
RCVALL\u ON
的值为
1
。NET方法应该为您包装管理数组大小的详细信息,因此您遇到的代码片段正在尝试为套接字启用
RCVALL\u ON

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

如果已安装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_值
,但是如果您查看
IOControl()
的示例,它们使用
BitConverter.GetBytes(0)
作为默认参数,默认参数的大小为4个字节(对应于.NET int)和你的例子相符。这足够大,可以容纳C操作中的
RCVALL\u值。

感谢您的详细有用评论,但是“byOut”数组呢?使用
byOut
指定的参数槽用于从所选IOControl功能接收数据。对于SIO_RCVALL,不需要特殊的返回数据(请参阅SIO_RCVALL链接上的lpvOutBuffer注释)。您可以传递空数组,甚至可能传递空数组。