2013-07-30 36 views
2

基於這裏的一些帖子,我寫了以下設置我的套接字KeepAlive的簡單方法,它似乎工作。拔掉以太網電纜以斷開兩個服務之間的連接後,我的網絡庫可以處理在SocketAsyncEventArgs Completed事件上傳輸的0字節,並觸發Disconnected事件。套接字KeepAlive單元

但由於某種原因,我需要使用百分之一秒而不是毫秒。我能找到的所有文檔似乎表明我應該使用毫秒。

(編輯),現在我已經驗證字節,則返回匹配這些其他兩種方法:

http://www.codeproject.com/Articles/117557/Set-Keep-Alive-Values

http://social.msdn.microsoft.com/Forums/en-US/35dfb50e-1e14-40c1-af01-f359be4d6a02/how-to-set-socket-keep-alive-timeinterval-values

(編輯)我也WireSharked這一點,可以驗證的KeepAlives當間隔設置爲500時,每5秒鐘外出一次。

什麼產生? .NET的最新版本中有什麼突破嗎?

private static byte[] GetKeepAliveOption(bool isEnabled, int keepAliveTime, int keepAliveInterval) 
{ 
    //time and interval are in hundredths of a second to work properly 
    //12 keepalive bytes, 1st 4 for enabled, next 4 for time, next 4 for interval 
    byte[] bytes = new byte[12]; 

    if (isEnabled) 
    { 
     bytes[0] = 1; 
    } 

    byte[] keepAliveTimeBytes = BitConverter.GetBytes(KeepAliveTime); 
    Buffer.BlockCopy(keepAliveTimeBytes, 0, bytes, 4, 4); 

    byte[] keepAliveIntervalBytes = BitConverter.GetBytes(KeepAliveInterval); 
    Buffer.BlockCopy(keepAliveIntervalBytes, 0, bytes, 8, 4); 

    return bytes; 
} 
+0

你的函數做了兩件事。請只顯示相關的代碼。通過三個參數('enabled','time','interval')將「tcp_keepalive結構體創建代碼」(除了'socket.IOControl()'調用)全部提取到一個單獨的方法中,該方法返回一個'byte [] '並顯示所需值的預期和實際輸出。通過這種方式,您可以在將這些字節傳遞給IOControl之前,測試並驗證這些字節是否包含您期望它們包含的內容。 – CodeCaster

+1

感謝您對CodeCaster的評論。對不起,我實際上只是試圖簡化這個方法,但是使用好的編程實踐並做一些單元測試絕對不會傷害;)我已經稍微改變了方法,編輯了文章以反映我做的測試。我的結論是? KeepAlive現在需要百分之一秒,而不是毫秒。 –

+0

你還沒有真正引用任何權威消息來源表明價值實際上是毫秒。我認爲你發現這兩篇文章的可能性比這種行爲突然改變的可能性要大得多。 –

回答

1

在評論中回答了我自己的問題。對不起,這是我的第一篇文章,我應該在這樣的答案中這樣做。

這樣做的主旨是瞭解的參數:

  • KeepAliveTime的是發送KeepAlive消息之間的時間間隔。

  • KeepAliveInterval是當初始KeepAlive消息沒有被查詢時發送重發探測器之間的間隔。