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
。
感謝您的詳細有用的評論,但「byOut」數組呢? – 2012-02-25 02:19:31
用'byOut'指定的參數槽用於接收從所選IOControl特徵返回的數據。對於SIO_RCVALL,不需要特殊的返回數據(請參見SIO_RCVALL鏈接上的lpvOutBuffer註釋)。您可能能夠傳遞一個空數組,甚至可能爲null。 – meklarian 2012-02-25 02:24:29