SIO_RCVALL控制項程式碼
描述
SIO_RCVALL控制程式代碼可讓通訊端接收通過網路介面的所有 IPv4 或 IPv6 封包。
若要執行這項作業,請使用下列參數呼叫 WSAIoctl 或 WSPIoctl 函 式。
int WSAIoctl(
(socket) s, // descriptor identifying a socket
SIO_RCV_ALL, // dwIoControlCode
NULL, // lpvInBuffer
0, // cbInBuffer
NULL, // lpvOutBuffer output buffer
(DWORD) cbOutBuffer, // size of output buffer
(LPDWORD) lpcbBytesReturned, // number of bytes returned
(LPWSAOVERLAPPED) lpOverlapped, // OVERLAPPED structure
(LPWSAOVERLAPPED_COMPLETION_ROUTINE) lpCompletionRoutine, // completion routine
);
參數
s
識別通訊端的描述項。
dwIoControlCode
作業的控制程式代碼。 使用此作業 SIO_RCVALL 。
lpvInBuffer
應該包含選項值的輸入緩衝區指標。 SIO_RCVALL IOCTL 選項的可能值是在Mstcpip.h標頭檔中定義的RCVALL_VALUE列舉中指定。
SIO_RCVALL的可能值如下所示:
值 | 意義 |
---|---|
RCVALL_OFF | 停用此選項,讓通訊端不會接收通過網路介面的所有 IPv4 或 IPv6 封包。 |
RCVALL_ON | 啟用此選項,讓通訊端接收通過網路介面的所有 IPv4 或 IPv6 封包。 如果 NIC 支援交集模式,此選項會在網路介面卡上啟用 NIC (NIC) 。 在具有網路中樞的 LAN 區段上,支援交集模式的 NIC 會擷取 LAN 上的所有 IPv4 或 IPv6 流量,包括相同 LAN 區段上其他電腦之間的流量。 根據通訊端) ,所有擷取的封包 (IPv4 或 IPv6 都會傳遞至原始通訊端。 此選項不會擷取 (ARP、IPX 和 NetBEUI 封包的其他封包,例如介面上的) 。 Netmon 會針對網路介面使用相同的模式,但不會使用此選項來擷取流量。 |
RCVALL_SOCKETLEVELONLY | 這項功能目前並未實作,因此設定此選項並不會影響任何影響。 |
RCVALL_IPLEVEL | 啟用此選項,讓 IPv4 或 IPv6 通訊端在透過網路介面傳遞的 IP 層級接收所有封包。 此選項不會在網路介面卡上啟用非交集模式。 此選項只會影響 IP 層級的封包處理。 NIC 仍然只會接收導向至其設定的單播和多播位址的封包。 不過,啟用此選項的通訊端不僅會收到導向至特定 IP 位址的封包,也會接收 NIC 接收的所有 IPv4 或 IPv6 封包。 此選項不會擷取 ARP、IPX 和 NetBEUI 封包 (其他封包,例如介面上收到的) 。 |
cbInBuffer
輸入緩衝區的大小,以位元組為單位。 此參數應該等於或大於lpvInBuffer參數所指向的RCVALL_VALUE列舉值大小。
lpvOutBuffer
輸出緩衝區的指標。 這個作業未使用此參數。
cbOutBuffer
輸出緩衝區的大小,以位元組為單位。 這個作業未使用此參數。
lmicrosoftBytesReturned
變數的指標,接收儲存在輸出緩衝區中的資料大小,以位元組為單位。 這個作業未使用此參數。
lpvOverlapped
WSAOVERLAPPED結構的指標。
如果 建立的 通訊端沒有重迭屬性,則會忽略 lpOverlapped 參數。
如果 已使用重迭屬性開啟 , 且 lpOverlapped 參數不是 Null,則會以重迭 (非同步) 作業來執行作業。 在此情況下, lpOverlapped 參數必須指向有效的 WSAOVERLAPPED 結構。
對於重迭的作業, WSAIoctl 或 WSPIoctl 函式會立即傳回,並在作業完成時發出適當的完成方法訊號。 否則,函式不會在作業完成或發生錯誤之前傳回。
lpCompletionRoutine
類型:_In_opt_ LPWSAOVERLAPPED_COMPLETION_ROUTINE
當作業完成時呼叫的完成常式指標, (忽略非重迭通訊端) 。
lpThreadId
提供者後續呼叫WPUQueueApc時要使用的WSATHREADID結構的指標。 提供者應該儲存參考的 WSATHREADID 結構, (直到 WPUQueueApc 函式傳回之後,才儲存相同) 的指標。
注意 此參數僅適用于 WSPIoctl 函 式。
lpErrno
錯誤碼的指標。
注意 此參數僅適用于 WSPIoctl 函 式。
傳回值
如果作業順利完成, WSAIoctl 或 WSPIoctl 函式會傳回零。
如果作業失敗或擱置中, WSAIoctl 或 WSPIoctl 函式會 傳回SOCKET_ERROR。 若要取得擴充的錯誤資訊,請呼叫 WSAGetLastError。
錯誤碼 | 意義 |
---|---|
WSA_IO_PENDING | 已成功起始重迭的作業,且稍後將會指出完成。 |
WSA_OPERATION_ABORTED | 因為通訊端關閉或 SIO_FLUSH IOCTL 命令的執行,所以取消重迭的作業。 |
WSAEFAULT | lpOverlapped或lpCompletionRoutine參數未完全包含在使用者位址空間的有效部分中。 |
WSAEINPROGRESS | 當回呼正在進行時,就會叫用函式。 |
WSAEINTR | 封鎖作業已中斷。 |
WSAEINVAL |
dwIoControlCode參數不是有效的命令,或無法接受指定的輸入參數,或命令不適用於指定的通訊端類型。 如果 cbInBuffer 參數小於 sizeof(UCHAR) 或 lpvInBuffer 參數指向不是 RCVALL_VALUE 列舉值的值,也會傳回此錯誤。 如果找不到與通訊端相關聯的網路介面,也可以傳回此錯誤。 如果刪除或移除與通訊端相關聯的網路介面, (移除 PCMCIA 或 USB 網路裝置,例如) , 就會發生這種情況。 |
WSAENETDOWN | 網路子系統失敗。 |
WSAENOBUFS | 沒有可用的緩衝區空間。 |
WSAENOPROTOOPT | 指定的通訊協定不支援通訊端選項。 |
WSAENOTSOCK | 描述項 s 不是通訊端。 |
WSAEOPNOTSUPP | 不支援指定的 IOCTL 命令。 如果傳輸提供者不支援 SIO_RCVALL IOCTL,就會傳回此錯誤。 |
備註
Windows 2000 和更新版本的作業系統支援 SIO_RCVALL IOCTL。
SIO_RCVALL IOCTL 可讓通訊端接收網路介面上的所有 IPv4 或 IPv6 封包。 傳遞至 WSAIoctl 或 WSPIoctl 函式的通訊端控制碼必須是下列其中一項:
- 建立的 IPv4 通訊端,位址系列設定為 AF_INET、通訊端類型設定為 SOCK_RAW,並將通訊協定設定為 IPPROTO_IP。
- 建立的 IPv6 通訊端,位址系列設定為 AF_INET6、通訊端類型設定為 SOCK_RAW,並將通訊協定設定為 IPPROTO_IPV6。
如需原始通訊端的詳細資訊,請參閱 TCP/IP 原始通訊端。
通訊端也必須系結至明確的本機 IPv4 或 IPv6 介面,這表示您無法系結至 INADDR_ANY 或 in6addr_any。
一旦通訊端系結且 IOCTL 順利完成, 對 WSARecv 或 recv 函式的呼叫會傳回透過指定 IPv4 介面傳遞的 IPv4 資料包,或傳回通過指定 IPv6 介面的 IPv6 資料包。 請注意,您必須提供夠大的緩衝區。 設定此 IOCTL 只會擷取指定介面上的 IPv4 或 IPv6 封包。 此 IOCTL 不會擷取 ARP、IPX 和 NetBEUI 封包 (其他封包,例如介面上的) 。
系結至具有 SIO_RCVALL IOCTL 之特定本機介面的通訊端只會接收透過該介面傳遞的封包。 它不會接收在另一個介面上接收的封包,也不會在與 SIO_RCVALL iOCTL 系結的通訊端不同的另一個介面上轉寄。
在 Windows Server 2008 和更早版本上, SIO_RCVALL IOCTL 設定不會擷取從網路介面傳送的本機封包。 這包括在另一個介面上收到的封包,並轉送出為 SIO_RCVALL IOCTL 指定的網路介面。
在 Windows 7 和 Windows Server 2008 R2 上,這已變更,因此也會擷取從網路介面傳送的本機封包。 這包括在另一個介面上收到的封包,然後將系結至通訊端的網路介面轉送給 具有 IOCTL SIO_RCVALL 。
設定此 IOCTL 需要本機電腦上的系統管理員許可權。
這項功能有時稱為「不對稱」模式。 不支援將此選項直接套用至一個介面,然後使用這個 IOCTL 單一呼叫到另一個介面。 應用程式必須先使用此 IOCTL 來關閉第一個介面上的行為,然後使用這個 IOCTL 在新介面上啟用行為。