共用方式為


SIO_RCVALL控制項程式碼

描述

SIO_RCVALL控制程式代碼可讓通訊端接收通過網路介面的所有 IPv4 或 IPv6 封包。

若要執行這項作業,請使用下列參數呼叫 WSAIoctlWSPIoctl 函 式。

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 結構。

對於重迭的作業, WSAIoctlWSPIoctl 函式會立即傳回,並在作業完成時發出適當的完成方法訊號。 否則,函式不會在作業完成或發生錯誤之前傳回。

lpCompletionRoutine

類型:_In_opt_ LPWSAOVERLAPPED_COMPLETION_ROUTINE

當作業完成時呼叫的完成常式指標, (忽略非重迭通訊端) 。

lpThreadId

提供者後續呼叫WPUQueueApc時要使用的WSATHREADID結構的指標。 提供者應該儲存參考的 WSATHREADID 結構, (直到 WPUQueueApc 函式傳回之後,才儲存相同) 的指標。

注意 此參數僅適用于 WSPIoctl 函 式。

lpErrno

錯誤碼的指標。

注意 此參數僅適用于 WSPIoctl 函 式。

傳回值

如果作業順利完成, WSAIoctlWSPIoctl 函式會傳回零。

如果作業失敗或擱置中, WSAIoctlWSPIoctl 函式會 傳回SOCKET_ERROR。 若要取得擴充的錯誤資訊,請呼叫 WSAGetLastError

錯誤碼 意義
WSA_IO_PENDING 已成功起始重迭的作業,且稍後將會指出完成。
WSA_OPERATION_ABORTED 因為通訊端關閉或 SIO_FLUSH IOCTL 命令的執行,所以取消重迭的作業。
WSAEFAULT lpOverlappedlpCompletionRoutine參數未完全包含在使用者位址空間的有效部分中。
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 封包。 傳遞至 WSAIoctlWSPIoctl 函式的通訊端控制碼必須是下列其中一項:

  • 建立的 IPv4 通訊端,位址系列設定為 AF_INET、通訊端類型設定為 SOCK_RAW,並將通訊協定設定為 IPPROTO_IP。
  • 建立的 IPv6 通訊端,位址系列設定為 AF_INET6、通訊端類型設定為 SOCK_RAW,並將通訊協定設定為 IPPROTO_IPV6。

如需原始通訊端的詳細資訊,請參閱 TCP/IP 原始通訊端

通訊端也必須系結至明確的本機 IPv4 或 IPv6 介面,這表示您無法系結至 INADDR_ANYin6addr_any

一旦通訊端系結且 IOCTL 順利完成, 對 WSARecvrecv 函式的呼叫會傳回透過指定 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 在新介面上啟用行為。

另請參閱

socket

TCP/IP 原始通訊端

WSAGetLastError

WSAGetOverlappedResult

WSAIoctl

WSAOVERLAPPED

WSASocketA

WSASocketW