Socket.IOControl - 模糊文档

时间:2012-02-25 00:55:07

标签: 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 - 什么选项?

2 个答案:

答案 0 :(得分:8)

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方法应该包含管理数组大小的详细信息,因此您遇到的代码片段是尝试为套接字启用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()的样本,他们会使用{{1}对于默认参数,其大小为4个字节(对应于.NET int)并与您的示例匹配。这个大到足以在{C}操作中适合BitConverter.GetBytes(0)

答案 1 :(得分:0)

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