1. 程式人生 > >基於Windows Socket 的網路通訊中的心跳機制原理

基於Windows Socket 的網路通訊中的心跳機制原理


(2)SIO_KEEPALIVE_VALS 機制 
         這是從彭博兄那裡學到一個機制拉,設定介面是WSAIoctl API:
     DWORD dwError = 0L ;
     tcp_keepalive sKA_Settings = {0}, sReturned = {0} ;
     sKA_Settings.onoff = 1 ;
     sKA_Settings.keepalivetime = 5500 ; // Keep Alive in 5.5 sec.
     sKA_Settings.keepaliveinterval = 3000 ; // Resend if No-Reply 
     if (WSAIoctl(skNewConnection, SIO_KEEPALIVE_VALS, &sKA_Settings,
          sizeof(sKA_Settings), &sReturned, sizeof(sReturned), &dwBytes,
          NULL, NULL) != 0)
     {
           dwError = WSAGetLastError() ;
     }
     實現時需要新增tcp_keepalive and SIO_KEEPALIVE_VALS的定義檔案MSTCPiP.h 
     該選項不同於SO_KEEPALIVE 機制的就是它是針對單個連線的,對系統其他的套接
     口並不影響。
        針對完成埠的socket,設定了SIO_KEEPALIVE_VALS後,啟用包由TCP STACK來負責。
     當網路連線斷開後,TCP STACK並不主動告訴上層的應用程式,但是當下一次RECV或者SEND操作
     進行後,馬上就會返回錯誤告訴上層這個連線已經斷開了.如果檢測到斷開的時候,在這個連線
     上有正在PENDING的IO操作,則馬上會失敗返回.