共用方式為


SIO_KEEPALIVE_VALS控制項程式碼

描述

SIO_KEEPALIVE_VALS控制項程式碼會啟用或停用 TCP keep-alive 選項的個別連線設定,指定 TCP 保持運作逾時和間隔。

若要執行這項作業,請使用下列參數呼叫 WSAIoctlWSPIoctl 函 式。

int WSAIoctl(
  (socket) s,              // descriptor identifying a socket
  SIO_KEEPALIVE_VALS,                  // dwIoControlCode
  (LPVOID) lpvInBuffer,    // pointer to tcp_keepalive struct
  (DWORD) cbInBuffer,      // length of input buffer
  NULL,         // output buffer
  0,       // 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_KEEPALIVE_VALS,                  // dwIoControlCode
  (LPVOID) lpvInBuffer,    // pointer to tcp_keepalive struct
  (DWORD) cbInBuffer,      // length of input buffer
  NULL,         // output buffer
  0,       // 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_KEEPALIVE_VALS

lpvInBuffer

輸入緩衝區的指標。 此參數應該指向 tcp_keepalive 結構。

cbInBuffer

輸入緩衝區的大小,以位元組為單位。 此參數應該等於或大於lpvInBuffer參數所指向之tcp_keepalive結構的大小。

lpvOutBuffer

輸出緩衝區的指標。 這個作業未使用此參數。

cbOutBuffer

輸出緩衝區的大小,以位元組為單位。 此參數必須設定為零。

lmicrosoftBytesReturned

變數的指標,接收儲存在輸出緩衝區中的資料大小,以位元組為單位。 這個傳回的參數會指向此作業的 DWORD 值為零 ,因為沒有輸出。

lpvOverlapped

WSAOVERLAPPED結構的指標。

如果 建立的 通訊端沒有重迭屬性,則會忽略 lpOverlapped 參數。

如果 已使用重迭屬性開啟 lpOverlapped 參數不是 Null,則會以重迭 (非同步) 作業來執行作業。 在此情況下, lpOverlapped 參數必須指向有效的 WSAOVERLAPPED 結構。

對於重迭的作業, WSAIoctlWSPIoctl 函式會立即傳回,並在作業完成時發出適當的完成方法訊號。 否則,函式不會在作業完成或發生錯誤之前傳回。

lpCompletionRoutine

類型:_In_opt_ LPWSAOVERLAPPED_COMPLETION_ROUTINE

當作業完成時呼叫的完成常式指標, (忽略非重迭通訊端) 。

lpThreadId

提供者後續呼叫WPUQueueApc時要使用的WSATHREADID結構的指標。 提供者應該儲存參考的 WSATHREADID 結構, (直到 WPUQueueApc 函式傳回之後,才儲存相同) 的指標。

注意 此參數僅適用于 WSPIoctl 函 式。

lpErrno

錯誤碼的指標。

注意 此參數僅適用于 WSPIoctl 函 式。

傳回值

如果作業順利完成, WSAIoctlWSPIoctl 函式會傳回零。

如果作業失敗或擱置中, WSAIoctlWSPIoctl 函式會 傳回SOCKET_ERROR。 若要取得擴充的錯誤資訊,請呼叫 WSAGetLastError

錯誤碼 意義
WSA_IO_PENDING 已成功起始重迭的作業,且稍後將會指出完成。
WSA_OPERATION_ABORTED 因為通訊端關閉或 SIO_FLUSH IOCTL 命令的執行而取消重迭的作業。
WSAEFAULT lpOverlappedlpCompletionRoutine參數未完全包含在使用者位址空間的有效部分中。
WSAEINPROGRESS 當回呼正在進行時,就會叫用函式。
WSAEINTR 封鎖作業已中斷。
WSAEINVAL dwIoControlCode參數不是有效的命令,或無法接受指定的輸入參數,或命令不適用於指定的通訊端類型。
WSAENETDOWN 網路子系統失敗。
WSAENOPROTOOPT 指定的通訊協定不支援通訊端選項。 資料包通訊端會傳回此錯誤。
WSAENOTSOCK 描述項 s 不是通訊端。
WSAEOPNOTSUPP 不支援指定的 IOCTL 命令。 如果傳輸提供者不支援 SIO_KEEPALIVE_VALS IOCTL,就會傳回此錯誤。

備註

Windows 2000 和更新版本的作業系統支援 SIO_KEEPALIVE_VALS IOCTL。

SIO_KEEPALIVE_VALS控制程式代碼會啟用或停用 TCP keep-alive 選項的個別連線設定,指定 TCP keep-alive 逾時和 TCP keep-alive 封包所使用的間隔。 如需 keep-alive 選項的詳細資訊,請參閱 IETF 網站上RFC 1122 中指定的通訊層需求一節 4.2.3.6。 (此資源只能以英文提供。)

lpvInBuffer參數應該指向Mstcpip.h標頭檔中定義的tcp_keepalive結構。 此結構的定義如下:

/* Argument structure for SIO_KEEPALIVE_VALS */
struct tcp_keepalive {
    u_long  onoff;
    u_long  keepalivetime;
    u_long  keepaliveinterval;
};

onoff成員中指定的值會判斷 TCP 保持運作是否已啟用或停用。 如果 onoff 成員設定為非零值,則會啟用 TCP keep-alive,並使用 結構中的其他成員。 keepalivetime成員會指定逾時,以毫秒為單位,直到傳送第一個保持運作封包為止,沒有活動。 keepaliveinterval成員會指定在未收到通知時,在連續的保持運作封包之間,以毫秒為單位來指定間隔。

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

keep-alive 逾時的預設全系統值可透過 KeepAliveTime 登錄設定來控制,以毫秒為單位的值。 如果未設定金鑰,預設的保持運作逾時為 2 小時。 keep-alive 間隔的預設全系統值可透過 KeepAliveInterval 登錄設定來控制,以毫秒為單位的值。 如果未設定索引鍵,預設的 keep-alive 間隔為 1 秒。

在 Windows Vista 和更新版本上, (資料重新傳輸) 的保留探查數目設定為 10 且無法變更。

在 Windows Server 2003、Windows XP 和 Windows 2000 上,保留探查數目的預設設定為 5。 可透過 TcpMaxDataRetransmissionsPPTPTcpMaxDataRetransmissions 登錄設定來控制保持運作探查的數目。 保持運作探查的數目會設定為兩個登錄機碼值中的較大值。 如果此數位為 0,則不會傳送 keep-alive 探查。 如果這個數位高於 255,則會調整為 255。

另請參閱

KeepAliveTime

KeepAliveInterval

PPTPTcpMaxDataRetransmissions

socket

SO_KEEPALIVE

WSAGetLastError

WSAGetOverlappedResult

WSAIoctl

WSAOVERLAPPED

WSASocketA

WSASocketW