SIO_LOOPBACK_FAST_PATH控制項程式碼
描述
SIO_LOOPBACK_FAST_PATH控制程式代碼會設定 TCP 通訊端,以降低延遲和更快速的回送介面作業。
重要SIO_LOOPBACK_FAST_PATH已被取代,不建議在程式碼中使用。
若要執行這項作業,請使用下列參數呼叫 WSAIoctl 或 WSPIoctl 函式。
int WSAIoctl(
(socket) s, // descriptor identifying a socket
SIO_LOOPBACK_FAST_PATH, // dwIoControlCode
(LPVOID) lpvInBuffer, // pointer to a Boolean value
(DWORD) cbInBuffer, // size, in bytes, of the input buffer
(LPVOID) lpvOutBuffer, // pointer to output buffer
(DWORD) cbOutBuffer, // size of output buffer
(LPDWORD) lpcbBytesReturned, // number of bytes returned
(LPWSAOVERLAPPED) lpOverlapped, // OVERLAPPED structure
(LPWSAOVERLAPPED_COMPLETION_ROUTINE) lpCompletionRoutine, // completion routine
);
int WSPIoctl(
(socket) s, // descriptor identifying a socket
SIO_LOOPBACK_FAST_PATH, // dwIoControlCode
(LPVOID) lpvInBuffer, // pointer to a Boolean value
(DWORD) cbInBuffer, // size, in bytes, of the input buffer
(LPVOID) lpvOutBuffer, // pointer to output buffer
(DWORD) cbOutBuffer, // size of output buffer
(LPDWORD) lpcbBytesReturned, // number of bytes returned
(LPWSAOVERLAPPED) lpOverlapped, // OVERLAPPED structure
(LPWSAOVERLAPPED_COMPLETION_ROUTINE) lpCompletionRoutine, // completion routine
(LPWSATHREADID) lpThreadId, // a WSATHREADID structure
(LPINT) lpErrno // a pointer to the error code.
);
參數
s
識別通訊端的描述項。
dwIoControlCode
作業的控制程式代碼。 針對此作業使用 SIO_LOOPBACK_FAST_PATH 。
lpvInBuffer
輸入緩衝區的指標。 此參數包含布林值的指標,指出是否應該為快速回送作業設定通訊端。
cbInBuffer
輸入緩衝區的大小,以位元組為單位。
lpvOutBuffer
輸出緩衝區的指標。 這個作業未使用此參數。
cbOutBuffer
輸出緩衝區的大小,以位元組為單位。 此參數必須設定為零。
lBytesReturned
變數的指標,可接收儲存在輸出緩衝區中的資料大小,以位元組為單位。
如果輸出緩衝區太小,則呼叫會失敗, WSAGetLastError 會傳回 WSAEINVAL, 而lBytesReturned 參數會指向零的 DWORD 值。
如果lpOverlapped為Null,則成功呼叫時所傳回之 lmicrosoftBytesReturned參數所指向的DWORD值不能為零。
如果重迭通訊端的 lpOverlapped 參數不是 Null ,則會起始無法立即完成的作業,而且稍後會指出完成。 傳回之lHTTPBytesReturned參數所指向的DWORD值可能是零,因為儲存的資料大小在重迭作業完成之前無法判斷。 當作業完成時發出適當的完成方法訊號時,可以擷取最終完成狀態。
lpvOverlapped
WSAOVERLAPPED結構的指標。
如果沒有重迭屬性建立通訊端,則會忽略 lpOverlapped參數。
如果使用重迭屬性開啟 s ,且 lpOverlapped 參數不是 Null,則會以重迭的 (非同步) 作業來執行作業。 在此情況下, lpOverlapped 參數必須指向有效的 WSAOVERLAPPED 結構。
對於重迭的作業, WSAIoctl 或 WSPIoctl 函式會立即傳回,並在作業完成時發出適當的完成方法訊號。 否則,在作業完成或發生錯誤之前,函式不會傳回 。
lpCompletionRoutine
類型:_In_opt_ LPWSAOVERLAPPED_COMPLETION_ROUTINE
當作業完成時呼叫的完成常式指標, (忽略非重迭通訊端) 。
lpThreadId
WSATHREADID結構的指標,供提供者在後續呼叫WPUQueueApc時使用。 提供者應該儲存參考的 WSATHREADID 結構, (在 WPUQueueApc 函式傳回之前,不要儲存相同) 的指標。
注意 此參數僅適用于 WSPIoctl 函式。
lpErrno
錯誤碼的指標。
注意 此參數僅適用于 WSPIoctl 函式。
傳回值
如果作業順利完成, WSAIoctl 或 WSPIoctl 函式會傳回零。
如果作業失敗或擱置中,WSAIoctl 或 WSPIoctl函式會傳回SOCKET_ERROR。 若要取得擴充錯誤資訊,請呼叫 WSAGetLastError。
錯誤碼 | 意義 |
---|---|
WSA_IO_PENDING | 重迭的 I/O 作業正在進行中。 如果成功起始重迭的作業,且稍後會指出完成,則會傳回此值。 |
WSA_OPERATION_ABORTED | 由於執行緒結束或應用程式的要求,因此已經中止 I/O 作業。 如果因為通訊端關閉或 執行 SIO_FLUSH IOCTL 命令而取消重迭的作業,就會傳回此錯誤。 |
WSAEACCES | 嘗試透過其存取權限禁止的方式來存取通訊端。 此錯誤會在持續埠保留的數個情況下傳回,包括下列專案:使用者缺少本機電腦上的必要系統管理許可權,或應用程式未在增強的殼層中執行,因為內建系統管理員 (RunAs administrator ) 。 |
WSAEFAULT | 系統在嘗試在呼叫中使用指標引數時偵測到不正確指標位址。 這個錯誤會傳回lpvInBuffer、lpvoutBuffer、lBytesReturned、lpOverlapped或lpCompletionRoutine參數,完全不包含在使用者位址空間的有效部分。 |
WSAEINPROGRESS | 正在執行封鎖作業。 如果在進行回呼時叫用函式,就會傳回此錯誤。 |
WSAEINTR | 封鎖作業因呼叫 WSACancelBlockingCall而中斷。 如果封鎖作業中斷,就會傳回此錯誤。 |
WSAEINVAL | 提供的引數無效。 如果 dwIoControlCode 參數不是有效的命令,或無法接受指定的輸入參數,或命令不適用於指定的通訊端類型,就會傳回此錯誤。 |
WSAENETDOWN | 通訊端作業遇到停止的網路。 如果網路子系統失敗,就會傳回此錯誤。 |
WSAENOTSOCK | 嘗試在不是通訊端的某個專案上執行作業。 如果描述元 s 不是通訊端,就會傳回此錯誤。 |
WSAEOPNOTSUPP | 參考的物件類型不支援嘗試的作業。 如果不支援指定的 IOCTL 命令,就會傳回此錯誤。 如果傳輸提供者不支援 SIO_LOOPBACK_FAST_PATH IOCTL,也會傳回此錯誤。 |
備註
應用程式可以使用 SIO_LOOPBACK_FAST_PATH IOCTL 來減少延遲,並改善 TCP 通訊端上回送作業的效能。 此 IOCTL 要求 TCP/IP 堆疊使用此通訊端上回送作業的特殊快速路徑。 SIO_LOOPBACK_FAST_PATH IOCTL 只能與 TCP 通訊端搭配使用。 這個 IOCTL 必須在回送會話的兩端使用。 使用 IPv4 或 IPv6 回送介面支援 TCP 回送快速路徑。
計畫起始連線要求的通訊端必須先套用此 IOCTL,才能提出連線要求。 因此, 連線、 ConnectEx、 WSAConnect、 WSAConnectByList或 WSAConnectByName 函式所使用的通訊端必須套用此 IOCTL,才能使用快速路徑進行回送作業。
接聽連線要求的通訊端必須先套用此 IOCTL,才能接受連線。 因此,接聽函式所使用的通訊端必須套用此 IOCTL,因此接受的任何通訊端都會使用快速路徑進行回送。 接聽函式傳回並傳遞至 accept、 AcceptEx或 WSAAccept 函式的任何通訊端都會標示為使用回送作業的特殊快速路徑。
一旦應用程式使用快速路徑在回送介面上建立連線,連線存留期的所有封包都必須使用快速路徑。
將 SIO_LOOPBACK_FAST_PATH 套用至將連線到非回送路徑的通訊端將不會有任何作用。
此 TCP 回送優化會導致透過傳輸層 (TL) ,而不是透過網路層進行傳統的回送的封包。 此優化可改善回送封包的延遲。 一旦應用程式加入宣告連線層級設定以使用回送快速路徑,所有封包都會遵循回送路徑。 對於回送通訊,預期不會發生壅塞和封包捨棄。 TCP 中的壅塞控制和可靠傳遞概念是不必要的。 不過,對於流程式控制制而言,這不是真正的。 如果沒有流量控制,傳送者可能會讓接收緩衝區負荷過重,導致錯誤 TCP 回送行為。 TCP 優化回送路徑中的流程式控制制是藉由將傳送要求放在佇列中來維護。 當接收緩衝區已滿時,TCP/IP 堆疊會保證在服務佇列維持流量控制之前,傳送不會完成。
在 Windows 篩選平台 (有一個 WINDOWS 篩選平臺) 連線資料的圖說文字時,TCP 快速路徑回送連線必須採用回送的未優化慢速路徑。 因此,此新回送篩選器會防止使用這個新的回送快速路徑。 啟用一個「計畫」篩選準則時,即使已設定 SIO_LOOPBACK_FAST_PATH IOCTL,我們還是會使用慢速路徑。 這可確保使用者模式應用程式具有完整的一致性安全性功能。
預設會停用 SIO_LOOPBACK_FAST_PATH 。
當 使用 SIO_LOOPBACK_FAST_PATH IOCTL 來啟用通訊端上的回送快速路徑時,僅支援 TCP/IP 通訊端選項的子集。 支援的選項清單包括下列各項:
- IP_TTL
- IP_UNICAST_IF
- IPV6_UNICAST_HOPS
- IPV6_UNICAST_IF
- IPV6_V6ONLY
- SO_CONDITIONAL_ACCEPT
- SO_EXCLUSIVEADDRUSE
- SO_PORT_SCALABILITY
- SO_RCVBUF
- SO_REUSEADDR
- TCP_BSDURGENT