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)说,modeRCVALL\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注释)。您可以传递空数组,甚至可能传递空数组。