SO_KEEPALIVE通訊端選項
SO_KEEPALIVE通訊端選項的設計目的是允許應用程式啟用通訊端連線的保持運作封包。
若要查詢這個通訊端選項的狀態,請呼叫 getsockopt 函式。 若要設定此選項,請使用下列參數呼叫 setockopt 函式。
表示這個通訊端選項的常數是0x0008。
int setsockopt(
(SOCKET) s, // descriptor identifying a socket
(int) SOL_SOCKET, // level
(int) SO_KEEPALIVE, // optname
(char *) optval, // input buffer,
(int) optlen // size of input buffer
);
-
s [in]
-
識別通訊端的描述項。
-
層級 [in]
-
定義選項的層級。 針對此作業使用 SOL_SOCKET 。
-
optname [in]
-
要設定值的通訊端選項。 針對此作業使用 SO_KEEPALIVE 。
-
optval [out]
-
緩衝區的指標,其中包含要設定之選項的值。 此參數應該指向等於或大於 DWORD 值大小的緩衝區。
這個值會被視為布林值,使用 0 表示 FALSE (停用) 和非零值,表示已啟用 TRUE () 。
-
optlen [in]
-
optval緩衝區的大小,以位元組為單位。 此大小必須等於或大於 DWORD 值的大小。
如果作業順利完成, setockopt 會傳回零。
如果作業失敗,則會傳回SOCKET_ERROR值,並呼叫 WSAGetLastError來擷取特定的錯誤碼。
錯誤碼 | 意義 |
---|---|
使用此函式之前,必須先進行成功的 WSAStartup 呼叫。 |
|
網路子系統失敗。 |
|
其中一個 optval 或 optlen 參數指向不在使用者位址空間有效部分的記憶體。 如果 optlen 參數所指向的值小於 DWORD 值的大小,也會傳回此錯誤。 |
|
封鎖的 Windows Sockets 1.1 呼叫正在進行中,或者服務提供者仍在處理回呼函式。 |
|
level參數未知或無效。 在 Windows Vista 和更新版本上,如果通訊端處於轉換狀態,也會傳回此錯誤。 |
|
指定的通訊協定系列未知或不支援此選項。 如果傳入 s 參數的通訊端描述元是用於資料包通訊端,就會傳回此錯誤。 |
|
描述項不是通訊端。 |
使用SO_KEEPALIVE通訊端選項呼叫的取得ockopt函式可讓應用程式擷取 keepalive 選項的目前狀態,雖然此功能通常不是使用的功能。 如果應用程式需要在通訊端上啟用 keepalive 封包,它只會呼叫 setockopt 函式來啟用選項。
使用SO_KEEPALIVE通訊端選項呼叫的setockopt函式可讓應用程式啟用通訊端連線的保持運作封包。 預設會停用通訊端 的SO_KEEPALIVE 選項, (設定為 FALSE) 。
啟用此通訊端選項時,當間隔內未收到任何資料或通知封包時,TCP 堆疊會傳送保持運作封包。 如需 keep-alive 選項的詳細資訊,請參閱IETF 網站上RFC 1122 中指定的通訊層需求一節 4.2.3.6。 (此資源只能以英文提供。)
SO_KEEPALIVE通訊端選項僅適用于支援 (連線導向通訊協定概念的通訊協定) 。 針對 TCP,預設的保持運作逾時為 2 小時,而保持運作間隔為 1 秒。 預設的保持運作探查數目會根據 Windows 版本而有所不同。
SIO_KEEPALIVE_VALS控制項程式碼可用來啟用或停用保持運作,以及調整單一連線的逾時和間隔。 如果使用 SO_KEEPALIVE啟用 keep-alive,則除非這些值已使用 SIO_KEEPALIVE_VALS變更,否則預設 TCP 設定會用於保持運作逾時和間隔。
keep-alive 逾時的預設全系統值可透過 KeepAliveTime 登錄設定來控制,以毫秒為單位的值。 Keep-alive 間隔的預設全系統值可透過 KeepAliveInterval 登錄設定來控制,以毫秒為單位的值。
在 Windows Vista 和更新版本上, (資料重新傳輸) 的保留探查數目會設定為 10 且無法變更。
在 Windows Server 2003、Windows XP 和 Windows 2000 上,保留探查數目的預設設定為 5。 保持運作探查的數目可透過 TcpMaxDataRetransmissions 和 PPTPTcpMaxDataRetransmissions 登錄設定來控制。 保持運作探查的數目會設定為兩個登錄機碼值的較大值。 如果此數位為 0,則不會傳送保持運作探查。 如果此數位高於 255,則會將其調整為 255。
在 Windows Vista 和更新版本上,只有在通訊端處於已知狀態不是轉換狀態時,才能使用setockopt函式來設定SO_KEEPALIVE通訊端選項。 針對 TCP,SO_KEEPALIVE通訊端選項應該在連線函式 (connect、ConnectEx、WSAConnect、WSAConnectByList或WSAConnectByName) 呼叫之前設定,或在實際完成連線要求之後設定。 如果以非同步方式呼叫 connect 函式,則這需要在嘗試設定 SO_KEEPALIVE 通訊端選項之前等候連線完成。 如果應用程式嘗試在連線要求仍在處理時設定 SO_KEEPALIVE 通訊端選項, 則 setockopt 函式將會失敗並傳回 WSAEINVAL。
在 Windows Server 2003、Windows XP 和 Windows 2000 上, 當通訊端是 轉換狀態 (連線要求仍在進行中) 以及已知狀態時,可以使用 setockopt 函式來設定SO_KEEPALIVE通訊端選項。
請注意, Ws2def.h 標頭檔會自動包含在 Winsock2.h中,不應直接使用。
需求 | 值 |
---|---|
最低支援的用戶端 |
Windows 2000 專業版 [僅限傳統型應用程式] |
最低支援的伺服器 |
Windows 2000 Server [僅限傳統型應用程式] |
標頭 |
|