我用VS2013MFC寫了一個基于TCP/IP的服務器和客戶端程式,用一臺電腦控制多臺電腦打開PPT,在多個投影儀上演示PPT,很完美!但是有一個遺憾,就是沒有實作心跳功能,我想利用WSAIoctl來實作心跳,程式如下:編譯,運行均正常。但是無論是把這段程式單獨放在服務器,單獨放在客戶端,還是客戶端服務器都放,我故意退出服務器或客戶端,等了10多分鐘,也沒有發生心跳。請指教!
//心跳包的實作----開啟KeepAlive
/* BOOL bKeepAlive = TRUE;
int nRet = ::setsockopt(sockClient, SOL_SOCKET, SO_KEEPALIVE, (char*)&bKeepAlive, sizeof(bKeepAlive));
if (nRet != 0)
{
AfxMessageBox(_T("出錯"));
return 0;
}
*/ //改變socket的keep alive心跳包為10s,并發送3次-----設定KeepAlive引數
tcp_keepalive inKeepAlive = { 0 }; //輸入引數
tcp_keepalive outKeepAlive = { 0 }; //輸出引數
unsigned long ulBytesReturn = 0;
inKeepAlive.onoff = true;
inKeepAlive.keepaliveinterval = 400; //兩次KeepAlive探測間的時間間隔
inKeepAlive.keepalivetime = 100; //開始首次KeepAlive探測前的TCP空閑時間
int nRet = WSAIoctl(sockClient, SIO_KEEPALIVE_VALS, &inKeepAlive, sizeof(inKeepAlive),
&outKeepAlive, sizeof(outKeepAlive), &ulBytesReturn, NULL, NULL);
if (SOCKET_ERROR == nRet)
{
AfxMessageBox(_T("出錯"));
return false;
}
uj5u.com熱心網友回復:
SO_KEEPALIVE屬于tcp內部實作心跳。我一般設定10秒檢測一次心跳。檢測斷開,還是要依靠recv . 回傳負數或0 就是斷開了
uj5u.com熱心網友回復:
還是自己做個心跳執行緒靠譜點uj5u.com熱心網友回復:
WSAEventSelect 選擇 FD_CLOSE , 監控這個關閉事件uj5u.com熱心網友回復:
你可以單獨創建一個連接來維持心跳機制~uj5u.com熱心網友回復:
謝謝你的回復!
我上面的程式那樣設定,對嗎?
我是用OnSocket訊息來接收對方的資料,如果對方已關閉,這個訊息就不回應了,是不是只能用執行緒做?
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/45337.html
標籤:基礎類
