2013-08-22 43 views
3

給定一個Windows套接字,我想確定它使用哪些值用於TCP存活空閒時間和TCP存活間隔時間(大致相當於TCP_KEEPIDLE和伯克利插座上的TCP_KEEPINTVL設置)。在Windows套接字上讀取SIO_KEEPALIVE_VALS字段(保持空閒和間隔時間)

我看到您可以使用WSAIoctl調用來設置這些值(請參閱http://msdn.microsoft.com/en-us/library/windows/desktop/dd877220%28v=vs.85%29.aspx)。但是,看起來沒有任何API用於讀取它們的當前值。我打過電話WSAIoctl用填充輸出參數,但NULL輸入參數,就像這樣:

DWORD bytes_returned; 
struct tcp_keepalive keepalive_opts; 
int rv = WSAIoctl(socket, SIO_KEEPALIVE_VALS, NULL, 0, &keepalive_opts, sizeof(keepalive_opts), &bytes_returned, NULL, NULL); 

但這返回我一個WSAEFAULT(以下簡稱「系統試圖在調用中使用指針參數檢測到無效的指針地址。 「)。

我可以調用WSAIoctl同時具有輸入和輸出參數,但我不想設置值,我只想讀取它們。據我所知,提供任何非NULL輸入參數將導致參數設置爲該內存空間中發生的任何值(由struct tcp_keepalive定義;同樣參見http://msdn.microsoft.com/en-us/library/windows/desktop/dd877220%28v=vs.85%29.aspx)。

上面還強調了不知道當前值是什麼的另一個問題:我不能設置保持活動空閒時間或保持活動間隔時間中的一個 - 我必須同時吹走兩個(未知)值因爲它們都是我需要提供的結構的成員。

我知道我可以假設基於Windows文檔設置了什麼值,但我寧願不假設。我看到http://technet.microsoft.com/en-us/library/bb726981.aspx#EDAA定義了KeepAliveIntervalKeepAliveTime默認值。但是,我的Windows 7註冊表中的Parameters文件夾不包含這兩個鍵中的任何一個,所以我真的必須依靠文檔在這裏100%正確(要知道套接字將接收的默認值),這比編程更糟糕檢索它們(即使從註冊表中檢索它們也可以,但上面的經驗表明我不能)。

有什麼辦法可以獲得Windows套接字的當前TCP keepalive空閒時間和TCP keepalive間隔時間值嗎?

回答

1

不像TCP_KEEPIDLETCP_KEEPINTVL,可與getsockopt()使用,沒有辦法讀取當前SIO_KEEPALIVE_VALS值的插座,只設置它們。

+0

這是你的經驗嗎?你是否從某個明確的來源中找到了這一點?我只是好奇你怎麼知道這是事實。 –

+1

錯誤,文檔? [的getsockopt()](http://msdn.microsoft.com/en-us/library/windows/desktop/ms738544%28v=vs.85%29.aspx); [setsockopt的()](http://msdn.microsoft.com/en-us/library/windows/desktop/ms740476%28v=vs.85%29.aspx); [的WSAIoctl()](http://msdn.microsoft.com/en-us/library/windows/desktop/ms741621%28v=vs.85%29.aspx)。 – EJP

+0

Well Remy說:「沒有辦法讀取套接字當前的SIO_KEEPALIVE_VALS值」,這非常具有決定性。很容易找到說有可能的文件,但很難證明某些事情是不可能的。你是否檢查了所有相關文件並確定它是不可能的(你列出的文件並非詳盡無遺)?或者發現其他一些來源說它是? –