我尝试 - 第一次 - 通过如此低级别的方式控制套接字.
通过教程,我遇到了以下几点:
byte[] byTrue = new byte [4] {1, 0, 0, 0};
byte[] byOut = new byte [4] {1, 0, 0, 0};
_Socket.IOControl(IOControlCode.ReceiveAll, byTrue, byOut);
Run Code Online (Sandbox Code Playgroud)
我提到了MSDN文档,但它确实很模糊.
题:
这两个字节的数组是什么?他们用的是什么?
文档说OPTIONS - 有哪些选择?
字节数组参数Socket.IOControl()特定于IOControlCode指定为第一个参数的字节数组参数.
第一个数组用于输入数据,第二个数组用于输出数据.
要查找有关这些数组的特定布局的更多信息,首先查看枚举是很有帮助的,该枚举列出了所有可能的操作.从那里,您应该与为Socket.IOControl()包装的C可操作函数列出的文档交叉引用.这些是WSAIoctl()和ioctlsocket().
IOControlCode Enumeration @ MSDN
WSAIoctl()函数@ MSDN
ioctlsocket()函数@ MSDN
根据以下文档IOControlCode.ReceiveAll:
启用接收网络上的所有IPv4数据包.套接字必须具有地址族InterNetwork,套接字类型必须为Raw,协议类型必须为IP.当前用户必须属于本地计算机上的Administrators组,并且套接字必须绑定到特定端口.Windows 2000及更高版本的操作系统支持此控制代码.该值等于Winsock 2 SIO_RCVALL常量.
交叉引用SIO_RCVALL,我们发现它在winsock文档中有一个条目.
阅读此条目,它提到输入缓冲区需要选择一种操作模式,最小大小对应于a RCVALL_VALUE.在语句中,您将传递1输入参数数组中的值.我们可以检查头文件以查看它应该是什么意思.
你应该用手头的C头文件仔细检查一下,但是wine的界面兼容副本(windows模拟器)说模式的值RCVALL_ON是1..NET方法应该包含管理数组大小的详细信息,因此您遇到的代码片段正在尝试RCVALL_ON为套接字启用.
以下是winehq.org上的C头文件的链接:winehq.org上的 mstcpip.h
如果您已经为visual studio安装了C/C++支持,那么您可以在类似于以下的路径中在本地找到mstcpip.h和winsock2.h:
C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Include\
Run Code Online (Sandbox Code Playgroud)
我的副本说:
//
// 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;
Run Code Online (Sandbox Code Playgroud)
我找不到任何专门说明应该使用什么大小的字节数组来传递a的文档RCVALL_VALUE,但是如果查看示例IOControl(),它们会BitConverter.GetBytes(0)用于默认参数,其大小为4个字节(对应于.NET) int)并匹配您的示例.这足够大以适应RCVALL_VALUEC操作.
| 归档时间: |
|
| 查看次数: |
4254 次 |
| 最近记录: |