LPWSPIOCTL 回呼函式 (ws2spi.h)

LPWSPIoctl函式會控制通訊端模式。

語法

LPWSPIOCTL Lpwspioctl;

int Lpwspioctl(
  [in]  SOCKET s,
  [in]  DWORD dwIoControlCode,
  [in]  LPVOID lpvInBuffer,
  [in]  DWORD cbInBuffer,
  [out] LPVOID lpvOutBuffer,
  [in]  DWORD cbOutBuffer,
  [out] LPDWORD lpcbBytesReturned,
  [in]  LPWSAOVERLAPPED lpOverlapped,
  [in]  LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine,
  [in]  LPWSATHREADID lpThreadId,
  [in]  LPINT lpErrno
)
{...}

參數

[in] s

識別通訊端的描述項。

[in] dwIoControlCode

要執行的作業控制程式代碼。

[in] lpvInBuffer

輸入緩衝區的指標。

[in] cbInBuffer

輸入緩衝區的大小,以位元組為單位。

[out] lpvOutBuffer

輸出緩衝區的指標。

[in] cbOutBuffer

輸出緩衝區的大小,以位元組為單位。

[out] lpcbBytesReturned

輸出實際位元組數目的指標。

[in] lpOverlapped

非重迭通訊端) 忽略 WSAOverlapped 結構的指標 (。

[in] lpCompletionRoutine

類型:_In_opt_ LPWSAOVERLAPPED_COMPLETION_ROUTINE

當作業完成時呼叫的完成常式指標, (忽略非重迭通訊端) 。 請參閱<備註>。

[in] lpThreadId

WSATHREADID結構的指標,供提供者在後續呼叫WPUQueueApc時使用。 提供者應該儲存參考的 WSATHREADID 結構, (在 WPUQueueApc 函式傳回之前,不會儲存指標) 。

[in] lpErrno

錯誤碼的指標。

傳回值

如果沒有發生錯誤,而且作業已立即完成, LPWSPIoctl 會傳回零。 請注意,在此情況下,如果已指定,則完成常式已排入佇列。 否則,會傳回SOCKET_ERROR值,而且 lpErrno中提供特定的錯誤碼。 錯誤碼WSA_IO_PENDING指出已成功起始重迭的作業,且稍後將會指出完成。 任何其他錯誤碼都表示未起始重迭的作業,也不會發生任何完成指示。

錯誤碼 意義
WSA_IO_PENDING
已成功起始重迭的作業,稍後將會指出完成。
WSAEFAULT
lpvInBuffer、lpvOutBufferlcbBytesReturned參數並未完全包含在使用者位址空間的有效部分,或cbInBuffer 或 cbOutBuffer參數太小
WSAEINVAL
dwIoControlCode不是有效的命令,或無法接受提供的輸入參數,或命令不適用於提供的通訊端類型。
WSAEINPROGRESS
當回呼正在進行時,會叫用函式。
WSAENETDOWN
網路子系統失敗。
WSAENOTSOCK
描述項 s 不是通訊端。
WSAEOPNOTSUPP
無法實現指定的 IOCTL 命令。 例如,無法滿足 SIO_SET_QOS 中指定的流程規格。
WSAEWOULDBLOCK
通訊端會標示為非封鎖,而且要求的作業會封鎖。

備註

此常式可用來設定或擷取與通訊端、傳輸通訊協定或通訊子系統相關聯的作業參數。 如果 lpOverlappedlpCompletionRoutine 都是 Null,此函式中的通訊端將會被視為非重迭的通訊端。

對於非重迭的通訊端, 會忽略 lpOverlappedlpCompletionRoutine 參數,而且如果通訊端 處於 封鎖模式,此函式可以封鎖。 請注意,如果通訊端 處於 非封鎖模式,如果指定的作業無法立即完成,此函式可以傳回 WSAEWOULDBLOCK 。 在此情況下,Windows Sockets SPI 用戶端可能會將通訊端變更為封鎖模式,並使用LPWSPEventSelect 或事件 (使用 LPWSPAsyncSelect () SIO_ADDRESS_LIST_CHANGE或事件 (使用 LPWSPEventSelect) 型通知機制,例如FD_ROUTING_INTERFACE_CHANGE或FD_ADDRESS_LIST_CHANGE SIO_ROUTING_INTERFACE_CHANGE等對應的網路事件 (。

對於重迭的通訊端,無法立即完成的作業將會起始,而且稍後會指出完成。 可能會忽略傳回之lmicrosoftBytesReturned參數所指向的DWORD值。 當作業完成時,可以擷取傳回的最終完成狀態和位元組。

根據服務提供者的實作而定,任何 IOCTL 可能會無限期地封鎖。 如果 Windows Sockets SPI 用戶端無法容許 在 LPWSPIoctl 呼叫中封鎖,建議針對最有可能封鎖的 IOCTLs,包括:

  • SIO_ADDRESS_LIST_CHANGE
  • SIO_FINDROUTE
  • SIO_FLUSH
  • SIO_GET_QOS
  • SIO_GET_GROUP_QOS
  • SIO_ROUTING_INTERFACE_CHANGE
  • SIO_SET_QOS
  • SIO_SET_GROUP_QOS

某些通訊協定特定的 IOCTL 也可能特別可能封鎖。 如需可用資訊,請查看相關的通訊協定特定附錄。

lpCompletionRoutine參數所指向完成常式的原型如下所示。

void CALLBACK 
CompletionRoutine(  
  IN DWORD           dwError, 
  IN DWORD           cbTransferred, 
  IN LPWSAOVERLAPPED lpOverlapped, 
  IN DWORD           dwFlags 
);

CompletionRoutine 是應用程式提供之函式名稱的預留位置。 dwError參數會指定重迭作業的完成狀態,如lpOverlapped參數所指出。 cbTransferred參數會指定收到的位元組數目。 dwFlags參數不會用於這個 IOCTL。 完成常式不會傳回值。

dwIoControlCode 參數現在是 32 位實體的情況下,可以採用編碼配置,以提供方便的方式分割 Opcode 識別碼空間。 dwIoControlCode參數是建構為在新增新的控制碼時允許通訊協定和廠商獨立,同時保留與 Windows Sockets 1.1 和 UNIX 控制程式代碼的回溯相容性。 dwIoControlCode參數的格式如下。

位 31 位 30 位 29 位 28 和 27 bits 26 至 16 位 15 到 0
I O V T 廠商/位址系列 程式碼

如果 輸入緩衝區對程式碼有效,則設定為與 IOC_IN相同。

如果輸出緩衝區對程式碼有效,則設定O,如同IOC_OUT一樣。 請注意,對於同時具有輸入和輸出參數的程式碼,將會設定 IO

如果沒有程式碼的參數,則會設定V,如同IOC_VOID

T 是定義 IOCTL 類型的兩位數量。 定義下列值。

  • 0 表示 IOCTL 是標準 UNIX IOCTL 程式碼,如同 FIONREADFIONBIO等等。
  • 1 表示 IOCTL 是一般 Windows Sockets 2 IOCTL 程式碼。 針對 Windows Sockets 2 定義的新 IOCTL 程式碼將會有T == 1
  • 2 表示 IOCTL 僅適用于特定位址系列。
  • 3 IOCTL 僅適用于特定廠商的提供者。 此類型可讓公司獲派廠商號碼,該號碼會出現在 Vendor/Address 系列 成員中。 然後,廠商可以定義該廠商特有的新 IOCTL,而不需要向清除中心註冊 IOCTL,進而提供廠商的彈性和隱私權。

廠商/位址系列是一個 11 位的數量,定義如果T3) ,則為擁有程式碼 (的廠商,如果T == == 2) ,則包含程式碼套用至其中的位址系列 (。 如果這是 UNIX IOCTL 程式碼 (T == 0) ,則此成員的值與 UNIX 上的程式碼相同。 如果這是一般 Windows Sockets 2 IOCTL (T == 1) ,則此成員可作為程式碼成員的延伸模組,以提供額外的程式碼值。

程式碼 是作業的特定 IOCTL 程式碼。

支援下列 UNIX 命令:

FIONBIO

啟用或 停用通訊端上的非封鎖模式。 lpvInBuffer參數指向未帶正負號的 long,如果啟用非封鎖模式,則為非零,如果停用則為零。 建立通訊端時,它會在封鎖模式 (運作,也就是停用非封鎖模式) 。 這與 Berkeley Software Distribution (BSD) 通訊端一致。

LPWSPAsyncSelectLPWSPEventSelect常式會自動將通訊端設定為非封鎖模式。 如果通訊端上發出 LPWSPAsyncSelectLPWSPEventSelect ,則任何嘗試使用 LPWSPIoctl 將通訊端設定回封鎖模式將會失敗, WSAEINVAL。 若要將通訊端設定回封鎖模式,Windows Sockets SPI 用戶端必須先呼叫lEvent參數等於零的LPWSPAsyncSelect 來停用 LPWSPAsyncSelect,或藉由呼叫LPWSPEventSelectlNetworkEvents參數等於零來停用LPWSPEventSelect

FIONREAD

判斷 可從通訊端讀取不可部分完成的資料量。 lpvOutBuffer參數會指向WSAIoctl儲存結果的未帶正負號長處。

例如,如果傳入 s 參數的通訊端是資料流程導向 (,則輸入 SOCK_STREAM) , FIONREAD 會傳回可在單一接收作業中讀取的資料總數;這通常與通訊端 (上排入佇列的資料總數相同,因為資料流程是位元組導向的,這不保證) 。

如果傳入 s 參數的通訊端是訊息導向 (,例如,輸入 SOCK_DGRAM) , FIONREAD 會傳回報告可供讀取的位元組總數,而不是通訊端上排入佇列的第一個資料包 () 訊息的大小。

SIOCATMARK

判斷是否已讀取所有 OOB 資料。 這只適用于資料流程樣式的通訊端 (,例如,輸入已設定為內嵌接收任何 OOB 資料 (SO_OOBINLINE) 的SOCK_STREAM) 。 如果沒有 OOB 資料正在等候讀取,作業會傳回 TRUE。 否則,它會傳回 FALSE,而且在通訊端上執行的下一個接收作業會擷取標記前面的部分或所有資料;Windows Sockets SPI 用戶端應該使用 SIOCATMARK 作業來判斷是否有任何保留。 如果緊急 (OOB) 資料之前有任何一般資料,則會依序接收。 (請注意,接收作業永遠不會在相同的呼叫中混合 OOB 和一般資料。) lpvOutBuffer點位於LPWSPIoctl儲存結果的BOOL

支援下列 Windows Sockets 2 命令:

SIO_ACQUIRE_PORT_RESER加值稅ION (opcode 設定:I、T==3)

要求 TCP 或 UDP 埠區塊的執行時間保留。 針對執行時間埠保留,埠集區會要求從授與保留通訊端的進程取用保留。 只有在呼叫 SIO_ACQUIRE_PORT_RESER加值稅ION IOCTL 的通訊端存留期之後,執行時間埠保留才會持續。 相反地,使用 CreatePersistentTcpPortReservationCreatePersistentUdpPortReservation 函式建立的持續性埠保留,可能會由任何能夠取得持續性保留的程式取用。

如需詳細資訊,請參閱 SIO_ACQUIRE_PORT_RESER加值稅ION 參考。

Windows Vista 和更新版本的作業系統支援SIO_ACQUIRE_PORT_RESER加值稅ION

SIO_ADDRESS_LIST_CHANGE (opcode 設定:T==1)

若要接收 Windows Sockets SPI 用戶端可系結之通訊端通訊協定系列本機傳輸地址清單中的變更通知。 完成此 IOCTL 時不會提供任何輸出資訊;完成隻會指出可用的本機地址清單已變更,而且應該透過 SIO_ADDRESS_LIST_QUERY重新查詢。

雖然 Windows Sockets SPI 用戶端使用重迭 I/O 完成SIO_ADDRESS_LIST_CHANGE要求,但假設 (不需要 ) 通知變更。 或者,如果在非封鎖通訊端上發出 SIO_ADDRESS_LIST_CHANGE IOCTL,而且沒有重迭的參數, (lpOverlappedlpCompletionRoutine 會設定為 Null) ,則會立即完成錯誤 WSAEWOULDBLOCK。 然後,Windows Sockets SPI 用戶端可以透過呼叫 LPWSPEventSelectLPWSPAsyncSelect 來等候地址清單變更事件,並在網路事件位元遮罩中設定FD_ADDRESS_LIST_CHANGE位。

SIO_ADDRESS_LIST_QUERY (opcode 設定:O、T==1)

取得應用程式可系結的通訊端通訊協定系列本機傳輸地址清單。 地址清單會根據地址系列而有所不同,有些位址會從清單中排除。

注意

在 Windows 隨插即用環境中,可以動態新增和移除位址。 因此,應用程式無法依賴 SIO_ADDRESS_LIST_QUERY 傳回的資訊,才能持續運作。 應用程式可以透過 SIO_ADDRESS_LIST_CHANGE IOCTL 登入位址變更通知,以透過重迭的 I/O 或FD_ADDRESS_LIST_CHANGE事件提供通知。 下列動作序列可用來保證應用程式一律有目前的通訊清單資訊:

 

  • IOCTL 問題SIO_ADDRESS_LIST_CHANGE
  • IOCTL 問題SIO_ADDRESS_LIST_QUERY
  • 每當 SIO_ADDRESS_LIST_CHANGE IOCTL 透過重迭的 I/O 或訊號傳送FD_ADDRESS_LIST_CHANGE事件) ,通知地址清單的套用 (變更時,應該重複整個動作序列。

如需詳細資訊,請參閱 SIO_ADDRESS_LIST_QUERY 參考。 Windows 2000 和更新版本支援SIO_ADDRESS_LIST_QUERY。

SIO_ASSOCIATE_HANDLE (opcode 設定:I、T==1)

將此通訊端與隨附介面的指定控制碼產生關聯。 輸入緩衝區包含對應至隨附 (介面資訊清單常數的整數值,例如,TH_NETDEV和TH_TAPI) ,後面接著是指定隨附介面控制碼的值,以及任何其他必要資訊。 如需其他詳細資料,請參閱 Windows Sockets 2 Protocol-Specific 附錄 和/或檔中的適當章節。 (這些資源只能以英文提供。) 總大小會反映在輸入緩衝區長度中。 不需要輸出緩衝區。 WSAENOPROTOOPT錯誤碼會針對不支援此 IOCTL 的服務提供者指出。 您可以使用 SIO_TRANSLATE_HANDLE來擷取這個 IOCTL 相關聯的控制碼。

例如,如果特定提供者提供下列專案,可能會使用隨附介面:

  • 對通訊端行為進行大量額外控制。
  • 未對應至現有 Windows Socket 函式的提供者特定控制項 (或未來可能) 的控制項。

建議您使用元件物件模型 (Component Object Model,COM),而不要使用這個 IOCTL,探索及追蹤通訊端可能支援的其他介面。 此 IOCTL 與 COM 無法使用或因其他原因而無法使用的系統有回溯相容性。

SIO_ASSOCIATE_PORT_RESER加值稅ION (opcode 設定:I、T==3)

將通訊端與持續性或執行時間保留區建立關聯,以用於埠保留權杖所識別的 TCP 或 UDP 埠區塊。 SIO_ASSOCIATE_PORT_RESER加值稅ION IOCTL 必須在通訊端系結之前發出。 如果和通訊端系結時,指派給它的埠將會從指定權杖所識別的埠保留區中選取。 如果沒有埠可從指定的保留區取得, Bind 函式呼叫將會失敗。

如需詳細資訊,請參閱 SIO_ASSOCIATE_PORT_RESER加值稅ION 參考。

Windows Vista 和更新版本的作業系統支援SIO_ASSOCIATE_PORT_RESER加值稅ION

SIO_BASE_HANDLE (opcode 設定:O、T==1)

擷取指定通訊端的基底服務提供者控制碼。 傳回的值是 SOCKET

分層服務提供者不應該攔截此 IOCTL,因為傳回值必須是基底服務提供者的通訊端控制碼。

如果輸出緩衝區不足以用於通訊端控制碼, (cbOutBuffer 小於 SOCKET) 的大小,或 lpvOutBuffer 參數是 Null 指標, SOCKET_ERROR 會傳回為這個 IOCTL 的結果, 而 WSAGetLastError 會傳回 WSAEFAULT

SIO_BASE_HANDLE 定義于 Mswsock.h 標頭檔中,並在 Windows Vista 和更新版本上支援。

SIO_BSP_HANDLE (opcode 設定:O、T==1)

擷取 WSASendMsg 函式所使用的通訊端基底服務提供者控制碼。 傳回的值是 SOCKET

此 Ioctl 是由分層服務提供者使用,以確保提供者攔截 WSASendMsg 函式

如果輸出緩衝區不足以用於通訊端控制碼, (cbOutBuffer 小於 SOCKET) 的大小,或 lpvOutBuffer 參數是 Null 指標, SOCKET_ERROR 會傳回為這個 IOCTL 的結果, 而 WSAGetLastError 會傳回 WSAEFAULT

SIO_BSP_HANDLE 定義于 Mswsock.h 標頭檔中,並支援 Windows Vista 和更新版本。

SIO_BSP_HANDLE_SELECT (opcode 設定:O、T==1)

擷取 select 函式所使用的通訊端基底服務提供者控制碼。 傳回的值是 SOCKET

此 Ioctl 是由分層服務提供者使用,以確保提供者攔截 選取 函式。

如果輸出緩衝區不足以用於通訊端控制碼, (cbOutBuffer 小於 SOCKET) 的大小,或 lpvOutBuffer 參數是 Null 指標, SOCKET_ERROR 會傳回為這個 IOCTL 的結果, 而 WSAGetLastError 會傳回 WSAEFAULT

SIO_BSP_HANDLE_SELECT 定義于 Mswsock.h 標頭檔中,並在 Windows Vista 和更新版本上支援。

SIO_BSP_HANDLE_POLL (opcode 設定:O、T==1)

擷取 WSAPoll 函式所使用的通訊端基底服務提供者控制碼。 lpOverlapped參數必須是Null指標。 傳回的值是 SOCKET

這個 Ioctl 是由分層服務提供者使用,以確保提供者攔截 WSAPoll 函式。

如果輸出緩衝區對通訊端控制碼不夠大, (cbOutBuffer 小於 SOCKET) 的大小, lpvOutBuffer 參數是 Null 指標,或者 lpOverlapped 參數不是 Null 指標, SOCKET_ERROR 會傳回做為此 IOCTL 的結果, 而 WSAGetLastError 會傳回 WSAEFAULT

SIO_BSP_HANDLE_POLL 定義于 Mswsock.h 標頭檔中,並在 Windows Vista 和更新版本上支援。

SIO_CHK_QOS (opcode 設定:I、O、T==3)

擷取 QoS 流量特性的相關資訊。 在流程設定與 RESV 訊息回條的轉換階段期間 (,請參閱 RSVP 服務如何叫用 TC 以取得轉換階段) 的詳細資訊,與 RSVP 流程相關聯的流量會根據服務類型 ( BEST EFFORT、CONTROLLED LOAD 或 GUARANTEED) 來成形。 如需詳細資訊,請參閱 Platform Software Development Kit (SDK) 的一節中的使用SIO_CHK_QOS。

SIO_ENABLE_CIRCULAR_QUEUEING (opcode 設定:V、T==1)

向訊息導向服務提供者指出,由於緩衝區佇列溢位,應該永遠不會卸載新抵達的訊息。 相反地,應該排除佇列中最舊的訊息,以容納新抵達的訊息。 不需要輸入和輸出緩衝區。 請注意,此 IOCTL 僅適用于與不可靠、訊息導向通訊協定相關聯的通訊端。 WSAENOPROTOOPT 錯誤碼會針對不支援此 IOCTL 的服務提供者指出。

SIO_FIND_ROUTE (opcode 設定:O、T==1)

發出時,此 IOCTL 會要求路由傳送至輸入緩衝區中指定為 sockaddr 的遠端位址。 如果位址已存在於本機快取中,則其專案會失效。 在 Novell 的 IPX 案例中,此呼叫會起始 IPX GetLocalTarget (GLT) ,以查詢指定遠端位址的網路。

SIO_FLUSH (opcode 設定:V、T==1)

捨棄與此通訊端相關聯的傳送佇列目前內容。 不需要輸入和輸出緩衝區。 WSAENOPROTOOPT錯誤碼會針對不支援此 IOCTL 的服務提供者指出。

SIO_GET_BROADCAST_ADDRESS (opcode 設定:O、T==1)

此 IOCTL 會將包含適當廣播位址 的 sockaddr 結構填滿輸出緩衝區,以便與 LPWSPSendTo搭配使用。

SIO_GET_EXTENSION_FUNCTION_POINTER (opcode 設定:O、I、T==1)

擷取相關聯服務提供者所支援之指定擴充函式的指標。 輸入緩衝區包含全域唯一識別碼 (GUID) ,其值可識別有問題的擴充函式。 所需的函式指標會在輸出緩衝區中傳回。 擴充功能函式識別碼是由服務提供者廠商所建立,而且應該包含在描述擴充功能功能和語意的廠商檔中。

Windows TCP/IP 服務提供者支援的擴充函式 GUID 值定義在 Mswsock.h 標頭檔中。 這些 GUID 的可能值如下所示:

詞彙 描述
WSAID_ACCEPTEX
AcceptEx延伸模組函式。
WSAID_CONNECTEX
ConnectEx延伸模組函式。
WSAID_DISCONNECTEX
DisconnectEx擴充功能函式。
WSAID_GETACCEPTEXSOCKADDRS
GetAcceptExSockaddrs擴充功能函式。
WSAID_TRANSMITFILE
TransmitFile延伸模組函式。
WSAID_TRANSMITPACKETS
TransmitPackets擴充功能函式。
WSAID_WSARECVMSG
LPFN_WSARECVMSG (WSARecvMsg) 擴充功能函式。
WSAID_WSASENDMSG
WSASendMsg擴充功能函式。

 

SIO_GET_GROUP_QOS (opcode 設定:O、T==1)

保留的。

SIO_GET_INTERFACE_LIST (opcode 設定:O、T==0)

傳回已設定 IP 介面及其參數的清單,做為 INTERFACE_INFO 結構的陣列。

注意

Windows Sockets 2 相容 TCP/IP 服務提供者必須支援此命令。

 

lpvOutBuffer參數會指向緩衝區,用來將介面的相關資訊儲存為介面上單播 IP 位址INTERFACE_INFO結構的陣列。 cbOutBuffer參數會指定輸出緩衝區的長度。 傳回的介面數目 (lpvOutBuffer 參數所指向之緩衝區中所傳回的結構數目,) 可以根據 lcpBytesReturned 參數中所傳回之輸出緩衝區的實際長度來決定。

如果使用SIO_GET_INTERFACE_LIST呼叫WSAIoctl函式,且通訊端s參數的層級成員未定義為IPPROTO_IP,則會傳回WSAEINVAL。 如果指定輸出緩衝區長度的cbOutBuffer參數太小,則使用 SIO_GET_INTERFACE_LIST呼叫WSAEFAULT會傳回WSAEFAULT

SIO_GET_INTERFACE_LIST_EX (opcode 設定:O、T==0)

保留供未來搭配通訊端使用。

傳回已設定 IP 介面及其參數的清單,做為 INTERFACE_INFO_EX 結構的陣列。

lpvOutBuffer參數指向緩衝區,用來將介面的相關資訊儲存為介面上單播 IP 位址INTERFACE_INFO_EX結構的陣列。 cbOutBuffer參數會指定輸出緩衝區的長度。 傳回的介面數目 (lpvOutBuffer 中傳回的結構數目,) 可以根據 在 lcpBytesReturned 參數中傳回之輸出緩衝區的實際長度來決定。

Windows 目前不支援SIO_GET_INTERFACE_LIST_EX。

SIO_GET_QOS (opcode 設定:O、T==1)

擷取與通訊端相關聯的 QOS 結構。 輸入緩衝區是選擇性的。 例如,某些通訊協定 (RSVP) 允許輸入緩衝區用來限定 QOS 要求。 QOS結構將會複製到輸出緩衝區。 輸出緩衝區的大小必須夠大,才能包含完整的 QOS 結構。 WSAENOPROTOOPT 錯誤碼會針對不支援服務品質的服務提供者指出。

SIO_IDEAL_SEND_BACKLOG_CHANGE (opcode 設定:V、T==0)

當理想的傳送待辦專案 (ISB) 值變更時,通知應用程式基礎連線。

使用 Windows 通訊端透過 TCP 連線傳送資料時,請務必保留足夠的未處理資料量, (傳送但尚未認可 TCP 中) ,才能達到最高的輸送量。 達到 TCP 連線最佳輸送量之未完成資料量的理想值,稱為理想的傳送待辦專案 (ISB) 大小。 ISB 值是 TCP 連線的頻寬延遲產品函式,以及接收者的公告接收視窗 (,以及網路) 的壅塞量。

每個連線的 ISB 值可從 Windows Server 2008 中的 TCP 通訊協定實作、具有 Service Pack 1 的 Windows Vista (SP1) 和更新版本的作業系統取得。 當 ISB 值動態變更連線時,應用程式可以使用 SIO_IDEAL_SEND_BACKLOG_CHANGE IOCTL 來取得通知。

如需詳細資訊,請參閱 SIO_IDEAL_SEND_BACKLOG_CHANGE 參考。

Windows Server 2008、Windows Vista SP1 和更新版本的作業系統支援SIO_IDEAL_SEND_BACKLOG_CHANGE。

SIO_IDEAL_SEND_BACKLOG_QUERY (opcode 設定:O、T==0)

擷取基礎連線的理想傳送待辦專案 (ISB) 值。

使用 Windows 通訊端透過 TCP 連線傳送資料時,請務必保留足夠的未處理資料量, (傳送但尚未認可 TCP 中) ,才能達到最高的輸送量。 達到 TCP 連線最佳輸送量之未完成資料量的理想值,稱為理想的傳送待辦專案 (ISB) 大小。 ISB 值是 TCP 連線的頻寬延遲產品函式,以及接收者的公告接收視窗 (,以及網路) 的壅塞量。

每個連線的 ISB 值可從 Windows Server 2008 和更新版本的 TCP 通訊協定實作取得。 應用程式可以使用 SIO_IDEAL_SEND_BACKLOG_QUERY IOCTL 來查詢連線的 ISB 值。

如需詳細資訊,請參閱 SIO_IDEAL_SEND_BACKLOG_QUERY 參考。

Windows Server 2008、Windows Vista SP1 和更新版本的作業系統支援SIO_IDEAL_SEND_BACKLOG_QUERY。

SIO_KEEPALIVE_VALS (opcode 設定:I、T==3)

啟用或停用 TCP keep-alive 選項的個別連線設定,指定 TCP 保持運作逾時和間隔。 如需 keep-alive 選項的詳細資訊,請參閱IETF 網站上RFC 1122 中指定的通訊層需求一節 4.2.3.6。

SIO_KEEPALIVE_VALS 可用來啟用或停用保持運作探查,並設定保持運作逾時和間隔。 keep-alive 逾時會指定逾時,以毫秒為單位,在傳送第一個保持運作封包之前,沒有活動。 keep-alive 間隔會指定在未收到通知時連續保持運作封包之間,以毫秒為單位的間隔。

SO_KEEPALIVE選項,這是其中一個SOL_SOCKET通訊端選項,也可用來啟用或停用連線上的 TCP 保持運作,以及查詢此選項的目前狀態。 若要查詢通訊端上是否已啟用 TCP 保持運作,可以使用SO_KEEPALIVE選項呼叫getsockopt函式。 若要啟用或停用 TCP 保持運作,可以使用SO_KEEPALIVE選項呼叫setockopt函式。 如果使用 SO_KEEPALIVE啟用 TCP 保持運作,則除非這些值已使用 SIO_KEEPALIVE_VALS變更,否則預設 TCP 設定會用於保持運作逾時和間隔。

如需詳細資訊,請參閱 SIO_KEEPALIVE_VALS 參考。 Windows 2000 和更新版本支援SIO_KEEPALIVE_VALS。

SIO_MULTIPOINT_LOOPBACK (opcode 設定:I、T==1)

控制本機電腦上應用程式所傳送的資料 (不一定由多播會話中的相同通訊端) 接收,都會由聯結至回送介面上的多播目的地群組的通訊端接收。 TRUE值會導致本機電腦上的應用程式傳送多播資料,以傳遞至回送介面上的接聽通訊端。 FALSE值可防止本機電腦上的應用程式傳送多播資料傳送到回送介面上的接聽通訊端。 預設會啟用 SIO_MULTIPOINT_LOOPBACK

SIO_MULTICAST_SCOPE ( opcode 設定:I、 T==1)

指定多播傳輸發生的範圍。 範圍定義為要涵蓋的路由網路區段數目。 零的範圍表示多播傳輸不會放線上路上,但可能會跨本機主機內的通訊端進行感染。 1 的範圍值 (預設) 表示傳輸會放線上路上,但不會跨越任何路由器。 較高的範圍值會決定可以交叉的路由器數目。 請注意,這會對應到 IP 多播中的存留時間 (TTL) 參數。

SIO_QUERY_RSS_SCALABILITY_INFO (opcode 設定:O、T==3)

查詢卸載接收端調整 (RSS) 功能的介面。 針對SIO_QUERY_RSS_SCALABILITY_INFO傳回的引數結構是在Mstcpip.h標頭檔中定義的RSS_SCALABILITY_INFO結構中指定。 此結構的定義如下。

void CALLBACK 
CompletionRoutine(  
  IN DWORD           dwError, 
  IN DWORD           cbTransferred, 
  IN LPWSAOVERLAPPED lpOverlapped, 
  IN DWORD           dwFlags 
);

RssEnabled成員中傳回的值指出是否在至少一個介面上啟用 RSS。

如果輸出緩衝區不足以用於 RSS_SCALABILITY_INFO結構, (cbOutBuffer 小於 RSS_SCALABILITY_INFO) 的大小,或 lpvOutBuffer 參數為 Null 指標, SOCKET_ERROR 會傳回為此 IOCTL 的結果,而 WSAGetLastError 會傳回 WSAEINVAL

在多個 CPU 位於單一系統內的高速網路中,網路通訊協定堆疊在多 CPU 系統上的延展能力會受到禁止,因為 NDIS 5.1 和舊版的架構會將接收通訊協定處理限制為單一 CPU。 接收端調整 (RSS) 可讓網路介面卡的網路負載在多個 CPU 之間平衡,來解決此問題。

Windows Vista 和更新版本支援SIO_QUERY_RSS_SCALABILITY_INFO

SIO_QUERY_WFP_ALE_ENDPOINT_HANDLE ( opcode 設定:O、T==3)

查詢 ALE) 端點控制碼 (應用層強制執行。

Windows 篩選平台 () 支援網路流量檢查和修改。 在 Windows Vista 中,其著重于主機電腦是通訊端點的案例。 不過,在 Windows Server 2008 中,有一個邊緣防火牆實作會想要利用一個一般平臺來檢查和 Proxy 傳遞流量。 INTERNET Security and Acceleration (ISA) 伺服器是這類邊緣裝置的範例。

有些防火牆案例可能需要將輸入封包插入現有端點相關聯的傳送路徑。 需要有一個機制,才能探索與目的地端點相關聯的傳輸層端點控制碼。 建立端點的應用程式擁有這些傳輸層端點。 這個 IOCTL 可用來提供通訊端控制碼給傳輸層端點控制碼對應。

如果輸出緩衝區不足以用於端點控制碼, (cbOutBuffer 小於 UINT64) 的大小,或 lpvOutBuffer 參數是 Null 指標, SOCKET_ERROR 會傳回為此 IOCTL 的結果,而 WSAGetLastError 會傳回 WSAEINVAL

Windows Vista 和更新版本支援SIO_QUERY_WFP_ALE_ENDPOINT_HANDLE

SIO_QUERY_PNP_TARGET_HANDLE (opcode 設定:O、T==1)

若要在鏈結中取得目前通訊端相依于 PnP 意義之下一個提供者的通訊端描述項。 只有透過 WPUCreateSocketHandle 呼叫建立的非 IFS 服務提供者通訊端上,Windows Sockets 2 DLL 才會叫用這個 IOCTL。 提供者應該在輸出緩衝區中傳回指定通訊端控制碼相依于 PnP 感知 (鏈結中下一個提供者的通訊端控制碼,例如,移除支援基礎控制碼的裝置會導致鏈結) 中上方的控制碼失效。

如果重迭的作業立即完成,此函式會傳回零的值,且 lkbBytesReturned 參數會以輸出緩衝區中的位元組數目更新。 如果已成功起始重迭的作業,且稍後會完成,此函式會傳回SOCKET_ERROR,並指出錯誤碼WSA_IO_PENDING。 在此案例中, lHTTPBytesReturned 不會更新。 當重迭的作業完成時,輸出緩衝區中的資料量會透過完成常式中的cbTransferred參數指示, (如果指定) ,或是透過LPWSPGetOverlappedResult中的lcbTransfer參數。

SIO_RCVALL (opcode 設定:I、 T==3)

可讓通訊端接收通過網路介面的所有 IPv4 或 IPv6 封包。 傳遞至 WSAIoctl 函式的通訊端控制碼必須是下列其中一項:

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

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

在 Windows Server 2008 和更早版本上, SIO_RCVALL IOCTL 設定不會擷取從網路介面傳送的本機封包。 這包括在另一個介面上收到的封包,並轉送出為 SIO_RCVALL IOCTL 指定的網路介面。

在 Windows 7 和 Windows Server 2008 R2 上,這已變更,因此也會擷取從網路介面傳送的本機封包。 這包括在另一個介面上收到的封包,然後將系結至通訊端的網路介面轉送給 具有 IOCTL SIO_RCVALL

設定此 IOCTL 需要本機電腦上的系統管理員許可權。

這項功能有時稱為「不對稱」模式。

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 封包 (其他封包,例如介面上收到的) 。

如需詳細資訊,請參閱 SIO_RCVALL 參考。

Windows 2000 和更新版本支援SIO_RCVALL。

SIO_RELEASE_PORT_RESER加值稅ION (opcode 設定:I、 T==3)

釋放 TCP 或 UDP 埠區塊的執行時間保留。 發行的執行時間保留必須已使用 SIO_ACQUIRE_PORT_RESER加值稅ION IOCTL 從發行程式取得。

如需詳細資訊,請參閱 SIO_RELEASE_PORT_RESER加值稅ION 參考。

Windows Vista 和更新版本的作業系統支援SIO_RELEASE_PORT_RESER加值稅ION

SIO_ROUTING_INTERFACE_CHANGE (opcode 設定:I、T==1)

若要接收路由介面變更的通知,該變更應該用來觸達輸入緩衝區中的遠端位址, (指定為 sockaddr 結構) 。 完成此 IOCTL 時,將不會提供新路由介面的輸出資訊;完成隻會指出指定目的地的路由介面已變更,而且應該使用 SIO_ROUTING_INTERFACE_QUERY IOCTL 進行查詢。

假設 (雖然不需要) 應用程式會使用重迭的 I/O,透過完成 SIO_ROUTING_INTERFACE_CHANGE 要求來通知路由介面變更。 或者,如果在非封鎖通訊端上發出 SIO_ROUTING_INTERFACE_CHANGE IOCTL,並將 lpOverlappedlpCompletionRoutine 參數設定為 Null) , 它將會立即完成,並出現錯誤 WSAEWOULDBLOCK ,而 Windows Socket SPI 用戶端接著可以使用呼叫 LPWSPEventSelectLPWSPAsyncSelect 來等候路由變更事件,並在網路事件位元遮罩中設定FD_ROUTING_INTERFACE_CHANGE位。

在大部分情況下,路由資訊會保持穩定,因此要求應用程式保留多個未處理的 IOCTL,以取得其感興趣的所有目的地通知,以及讓服務提供者追蹤這些通知要求將會使用大量的系統資源。 您可以藉由擴充輸入參數的意義並放寬服務提供者需求,以避免這種情況,如下所示:

Windows Sockets SPI 用戶端可以在要求系結至任何可用的位址時,指定通訊協定系列特定的萬用字元位址 (與 結呼叫中使用的通訊協定系列) ,以要求任何路由變更的通知。 這可讓 Windows Sockets SPI 用戶端只針對它擁有的所有通訊端和目的地保留一個未處理的 SIO_ROUTING_INTERFACE_CHANGE ,然後使用 SIO_ROUTING_INTERFACE_QUERY 來取得實際的路由資訊。

服務提供者可以選擇忽略 windows Sockets SPI 用戶端在 SIO_ROUTING_INTERFACE_CHANGE ( 輸入緩衝區中所提供的資訊,就像 Windows Sockets SPI 用戶端在輸入緩衝區中指定的萬用字元位址) 一樣,並在發生任何路由資訊變更時完成 SIO_ROUTING_INTERFACE_CHANGE IOCTL 或訊號FD_ROUTING_INTERFACE_CHANGE事件,而不只是路由傳送至輸入緩衝區中指定的目的地 () 。

SIO_ROUTING_INTERFACE_QUERY (opcode 設定:I、O、T==1)

若要取得本機介面的位址, (表示為 sockaddr 結構) ,該結構應該用來傳送至輸入緩衝區中指定的遠端位址, (為 sockaddr) 。 遠端多播位址可能會在輸入緩衝區中提交,以取得多播傳輸慣用介面的位址。 在任何情況下,應用程式可以在後續的 Bind 要求中使用傳回的介面位址。

請注意,路由可能會變更。 因此,Windows Socket SPI 用戶端無法依賴 SIO_ROUTING_INTERFACE_QUERY 傳回的資訊,才能持續運作。 SPI 用戶端可以使用 SIO_ROUTING_INTERFACE_CHANGE IOCTL 註冊路由變更通知,以透過重迭的 I/O 或FD_ROUTING_INTERFACE_CHANGE事件提供通知。 下列動作順序可用來保證 Windows Socket SPI 用戶端一律具有指定目的地的目前路由介面資訊:

  • IOCTL SIO_ROUTING_INTERFACE_CHANGE問題。
  • IOCTL SIO_ROUTING_INTERFACE_QUERY問題。
  • 每當 SIO_ROUTING_INTERFACE_CHANGE IOCTL 通知 WinSock SPI 用戶端透過重迭 I/O 或發出FD_ROUTING_INTERFACE_CHANGE事件) 的訊號來 (變更路由變更時,應該重複整個動作順序。

如果輸出緩衝區不夠大而無法包含介面位址,SOCKET_ERROR會傳回此 IOCTL 的結果,而 WSAGetLastError 會傳回 WSAEFAULT。 在此情況下,輸出緩衝區的必要大小將會以 lHTTPBytesReturned 傳回。 請注意,如果 lpvInBufferlpvOutBufferlmicrosoftBytesReturned 參數未完全包含在使用者位址空間的有效部分中,也會傳回 WSAEFAULT 錯誤碼。

如果無法透過任何可用的介面來連線到輸入緩衝區中指定的目的地位址,SOCKET_ERROR會因為這個 IOCTL 而 WSAGetLastError 傳回 WSAENETUNREACH ,甚至傳回 WSAENETDOWN 。如果所有網路連線都遺失,則會傳回 WSAENETDOWN。

SIO_SET_COMPATIBILITY_MODE (opcode 設定:I、T==3)

要求網路堆疊應如何處理特定行為,而預設處理行為的方式可能會因 Windows 版本而異。 SIO_SET_COMPATIBILITY_MODE的引數結構是在Mswsockdef.h標頭檔中定義的WSA_COMPATIBILITY_MODE結構中指定。 此結構的定義如下:

} WSA_COMPATIBILITY_MODE, *PWSA_COMPATIBILITY_MODE;

BehaviorId成員中指定的值表示所要求的行為。 TargetOsVersion成員中指定的值表示正在要求行為的 Windows 版本。

BehaviorId成員可以是mswsockdef.h標頭檔中所定義WSA_COMPATIBILITY_BEHAVIOR_ID列舉類型的其中一個值。 BehaviorId成員的可能值如下所示

詞彙 描述
WsaBehaviorAll
這相當於要求針對 WSA_COMPATIBILITY_BEHAVIOR_ID定義的所有可能相容行為。
WsaBehaviorReceiveBuffering
TargetOsVersion 成員設定為 Windows Vista 或更新版本的值時,即使 TCP 連線已建立之後,仍允許使用 SO_RCVBUF 通訊端選項將此通訊端上的 TCP 接收緩衝區大小縮減。
TargetOsVersion 成員設定為早于 Windows Vista 的值時,在連線建立之後,不允許使用 SO_RCVBUF 通訊端選項將此通訊端上的 TCP 接收緩衝區大小縮減。
WsaBehaviorAutoTuning
TargetOsVersion 成員設定為 Windows Vista 或更新版本的值時,會啟用接收視窗自動調整,並將 TCP 視窗縮放比例從預設值 8 縮減為 2。
TargetOsVersion 設定為早于 Windows Vista 的值時,會停用接收視窗自動調整。 TCP 視窗縮放選項也會停用,而且 true 接收視窗大小上限限制為 65,535 個位元組。 即使在此通訊端上呼叫 了 SO_RCVBUF 通訊端選項,而且在建立連線之前指定大於 65,535 個位元組的值,也無法交涉連線上的 TCP 視窗調整選項。

 

如需詳細資訊,請參閱 SIO_SET_COMPATIBILITY_MODE 參考。

Windows Vista 和更新版本支援SIO_SET_COMPATIBILITY_MODE

SIO_SET_GROUP_QOS (opcode 設定:I、 T==1)

保留的。

SIO_SET_QOS (opcode 設定:I、T==1)

將提供的 QOS 結構與通訊端產生關聯。 不需要輸出緩衝區, QOS 結構將從輸入緩衝區取得。 針對不支援服務品質的服務提供者,會指出 WSAENOPROTOOPT 錯誤碼。

SIO_TRANSLATE_HANDLE ( opcode 設定:I、O、T==1)

若要取得在隨附介面內容中 有效的通訊端對應 控制碼, (例如,TH_NETDEV和TH_TAPI) 。 資訊清單常數,識別隨附介面以及輸入緩衝區中指定任何其他必要參數。 完成此函式時,輸出緩衝區中將會提供對應的控制碼。 如需其他詳細資料,請參閱 Windows Sockets 2 Protocol-Specific 附錄 和/或檔中的適當章節。 WSAENOPROTOOPT錯誤碼會針對不支援指定隨附介面的這個 IOCTL 的服務提供者指出。 此 IOCTL 會使用 SIO_TRANSLATE_HANDLE擷取相關聯的控制碼。

建議您使用 COM 來取代此 IOCTL 來探索和追蹤通訊端可能支援的其他介面。 此 IOCTL 與 COM 無法使用或因其他原因而無法使用的系統有回溯相容性。

SIO_UDP_CONNRESET (opcode 設定:I、T==3)

Windowsxp: 控制是否報告 UDP PORT_UNREACHABLE訊息。 設定為 TRUE 以啟用報告。 設定為 FALSE 以停用報告。

使用重迭的通訊端呼叫時, lpOverlapped 參數在重迭作業期間必須有效。

如果lpCompletionRoutine參數為Null,當重迭的作業包含有效的事件物件控制碼時,服務提供者會發出lpOverlappedhEvent成員訊號。 Windows Sockets SPI 用戶端可以使用 LPWSPGetOverlappedResult 來輪詢或等候事件物件。

如果 lpCompletionRoutine 不是 Null則會忽略 hEvent 成員,而且可由 Windows Sockets SPI 用戶端用來將內容資訊傳遞至完成常式。 將非NulllpCompletionRoutine和更新版本的用戶端針對相同的重迭 I/O 要求呼叫WSAGetOverlappedResult的用戶端,可能不會將該WSAGetOverlappedResult叫用的fWait參數設定為TRUE。 在此情況下, 未定義 hEvent 成員的使用方式,而嘗試等候 hEvent 成員會產生無法預期的結果。

當重迭的作業完成時,服務提供者必須負責安排用戶端指定完成常式的叫用。 由於完成常式必須在起始重迭作業之相同執行緒的內容中執行,因此無法直接從服務提供者叫用。 WS2_32.DLL 提供非同步程序呼叫 (APC) 機制,以協助叫用完成常式。

服務提供者會藉由呼叫 WPUQueueApc,安排在適當的執行緒和進程內容中執行的函式。 此函式可以從任何進程和執行緒內容呼叫,甚至是與用來起始重迭作業之執行緒和進程不同的內容。

WPUQueueApc 會採用輸入參數作為 WSATHREADID 結構的指標, (透過 lpThreadId 輸入參數提供給提供者) 、要叫用的 APC 函式指標,以及後續傳遞至 APC 函式的 32 位內容值。 因為只有單一 32 位的內容值可用,所以 APC 函式本身不能是用戶端指定的完成常式。 服務提供者必須改為提供自己的 APC 函式指標,該函式會使用提供的內容值來存取重迭作業所需的結果資訊,然後叫用用戶端指定的完成常式。

用戶端提供的完成常式原型如下所示:

);

CompletionRoutine 是用戶端提供的函式預留位置。 dwError會指定重迭作業的完成狀態,如lpOverlapped所指出。 cbTransferred會指定傳回的位元組數目。 目前沒有定義旗標值, dwFlags 會是零。 此函式不會傳回值。

從此函式傳回允許叫用此通訊端的另一個擱置完成常式。 完成常式可以依任何順序呼叫,但不一定以重迭作業完成的順序相同。

相容性

具有 T == 0 的 IOCTL 代碼是 一部分的 IOCTL 程式碼,用於通訊端。 特別是沒有相當於 FIOASYNC 的命令。

注意

當該執行緒結束時,指定的執行緒所起始的所有 I/O 都會取消。 對於重迭的通訊端,如果執行緒在作業完成之前關閉,擱置的非同步作業可能會失敗。 如需詳細資訊,請參閱 ExitThread

規格需求

   
最低支援的用戶端 Windows 2000 Professional [僅限傳統型應用程式]
最低支援的伺服器 Windows 2000 Server [僅限桌面應用程式]
標頭 ws2spi.h

另請參閱

WPUQueueApc

LPWSPGetSockopt

LPWSPSetSockOpt

LPWSPSocket