2012-02-25 231 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