我试图 - 第一次 - 通过如此低级别的方式控制插座 通过教程,我遇到了以下几点:
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 - 什么选项?
答案 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。