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]

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

選擇名稱 [in]

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

optval [輸出]

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

此值會被視為布林值,其中 0 用於表示 FALSE (已停用) ,非零值用於表示 TRUE (已啟用) 。

optlen [輸入、輸出]

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

返回值

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

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

錯誤碼 Meaning
WSANOTINITIALIZED
使用此函式之前,必須先進行成功的 WSAStartup 呼叫。
WSAENETDOWN
網路子系統發生故障。
WSAEFAULT
其中一個 optval 或 optlen 參數指向不在使用者位址空間有效部分的記憶體。 如果 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 機制完全接受之前,永遠不會完全接受連線。
  • 這也表示應用程式會注意一律處於狀態,以輕鬆處理接受回呼以接受連線。 如果應用程式忙於執行其他處理,則用戶端可能會在應用程式實際接受連線之前逾時。 這會導致糟糕的客戶體驗。
  • 某些 TCP 堆疊最佳化不適用於完全接受的連線,即使在條件式接受完成之後也是如此。 這可能會降低連線在其整個生命週期內的效能。

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

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

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

需求

Requirement 價值觀
最低支援的用戶端
Windows Vista [僅限傳統型應用程式]
最低支援的伺服器
Windows Server 2008 [僅限傳統型應用程式]
Header
Ws2def.h(包括 Winsock2.h)

另請參閱

getsockopt

setsockopt

WSA確認