2012-02-25 234 views
7

我试图 - 首次 - 通过如此低的水平的方式
通过教程步行控制一个插座,我面临这些行:Socket.IOControl - 歧义文档

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个字节阵列?他们使用什么?
该文件说选项 - 什么选项?

回答

7

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

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

要查找有关这些数组的特定布局的更多信息,首先查看枚举,这会列出所有可能的操作。从那里开始,您应该参考列出的可用于C可操作功能的文档,其中包含了Socket.IOControl()。这些是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

如果您已经安装了C/C++的Visual Studio支持,您可以找到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; 

我找不到那个具体说了任何文件s什么尺寸的字节数组应该用来通过RCVALL_VALUE,但是如果你看IOControl()的样本,他们使用BitConverter.GetBytes(0)作为默认参数,它的大小为4字节(对应于一个.NET int)并且与你的例子相匹配。这足以在C操作中适合RCVALL_VALUE

+0

感谢您的详细有用的评论,但“byOut”数组呢? – 2012-02-25 02:19:31

+1

用'byOut'指定的参数槽用于接收从所选IOControl特征返回的数据。对于SIO_RCVALL,不需要特殊的返回数据(请参见SIO_RCVALL链接上的lpvOutBuffer注释)。您可能能够传递一个空数组,甚至可能为null。 – meklarian 2012-02-25 02:24:29

0

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

+0

将它们都设置为null给出错误! – 2012-02-25 01:30:06