SO_CONDITIONAL_ACCEPT通訊端選項

SO_CONDITIONAL_ACCEPT通訊端選項的設計目的是允許應用程式決定是否接受接聽通訊端上的連入連線。

通訊端選項值

代表這個通訊端選項的常數0x3002。

語法

int setsockopt(
  (SOCKET) s,      // descriptor identifying a socket 
  (int) SOL_SOCKET,   // level
  (int) SO_CONDITIONAL_ACCEPT, // optname
  (char *) optval,         // input buffer,
  (int) optlen,       // size of input buffer
);

參數

s [in]

識別通訊端的描述項。

層級 [in]

定義選項的層級。 使用此作業 SOL_SOCKET

optname [in]

要設定值的通訊端選項。 使用此作業 SO_CONDITIONAL_ACCEPT

optval [out]

緩衝區的指標,其中包含要設定之選項的值。 此參數應該指向等於或大於 DWORD 值大小的緩衝區。

這個值會被視為布林值,其值為 0,用來表示 FALSE (停用) 和非零值,以表示已啟用 TRUE () 。

optlen [in, out]

optval緩衝區的大小指標,以位元組為單位。 此大小必須等於或大於 DWORD 值的大小。

傳回值

如果作業順利完成, 則 setsockopt 會傳回零。

如果作業失敗,則會傳回SOCKET_ERROR的值,並呼叫 WSAGetLastError來擷取特定的錯誤碼。

錯誤碼 意義
WSANOTINITIALISED
使用這個函式之前,必須先進行成功的 WSAStartup 呼叫。
WSAENETDOWN
網路子系統失敗。
WSAEFAULT
其中一個 optvaloptlen 參數指向不在使用者位址空間有效部分的記憶體。 如果 optlen 參數所指向的值小於 DWORD 值的大小,也會傳回此錯誤。
WSAEINPROGRESS
封鎖的 Windows Sockets 1.1 呼叫正在進行中,或服務提供者仍在處理回呼函式。
WSAEINVAL
level參數未知或無效。 如果通訊端已經處於接聽狀態,也會傳回此錯誤。
WSAENOPROTOOPT
指定的通訊協定系列未知或不支援此選項。
WSAENOTSOCK
描述項不是通訊端。

 

備註

使用SO_CONDITIONAL_ACCEPT通訊端選項呼叫的setsockopt函式可讓應用程式決定是否接受接聽通訊端上的連入連線。 預設會停用通訊端的條件式接受選項, (設定為 FALSE) 。

啟用此通訊端選項時,TCP 堆疊不會自動接受連線。 它會等候應用程式指示它透過向 WSAAccept 函式註冊的條件式接受回呼來接受連線。 收到連線要求之後,Winsock 會叫用應用程式所註冊的條件式接受回呼。 只有在條件式接受回呼傳回 CF_ACCEPT Winsock 才會通知傳輸完全接受連線。

[SO_CONDITIONAL_ACCEPT 通訊端] 選項設定為 [已啟用] (設定為 TRUE) 時,這會對通訊端有數個副作用:

  • 這會停用 TCP 堆疊的內建 SYN 攻擊防護防禦,因為應用程式現在會取得接受連線的擁有權。
  • 這實際上會停用接聽待辦專案,因為不會代表接聽通訊端接受連線。 在應用程式完全接受使用 CF_ACCEPT 機制之前,永遠不會完全接受連線。
  • 這也表示應用程式一律處於狀態,以立即處理接受回呼以接受連線。 如果應用程式忙於執行其他處理,則用戶端可能會在應用程式實際接受連線之前逾時。 這會導致用戶端體驗不佳。

一般而言,應用程式使用條件式接受的主要原因是檢查連線用戶端所使用的來源 IP 位址或埠,然後決定接受或拒絕連線。 不過,如果未啟用SO_CONDITIONAL_ACCEPT選項,且應用程式允許 TCP 堆疊和接聽待辦專案如預期般運作,應用程式可能會執行得更好。 然後,當應用程式處理已接受的連線時,如果它來自不正確的 IP 來源位址或埠,則應用程式可以直接關閉通訊端。 此行為的安全性缺點是,現在用戶端已確認應用程式正在接聽 IP 位址和埠,因為它會強制關閉先前接受的連線。 不過,啟用 SO_CONDITIONAL_ACCEPT 的缺點通常超過這項限制。

使用SO_CONDITIONAL_ACCEPT通訊端選項呼叫的getsockopt函式可讓應用程式擷取條件式接受選項的目前狀態,雖然此功能通常不是常用的功能。 如果應用程式需要在通訊端上啟用條件式接受,它只會呼叫 setsockopt 函式來啟用選項。

請注意, Ws2def.h 標頭檔會自動包含在 Winsock2.h中,不應該直接使用。

規格需求

需求
最低支援的用戶端
Windows Vista [僅限傳統型應用程式]
最低支援的伺服器
Windows Server 2008 [僅限傳統型應用程式]
標頭
Ws2def.h (包含 Winsock2.h)

另請參閱

getsockopt

setsockopt

WSAAccept