我用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熱心網友回復:
WSAEventSelect 選擇 FD_CLOSE , 監控這個關閉事件uj5u.com熱心網友回復:
你可以單獨創建一個連接來維持心跳機制~uj5u.com熱心網友回復:
你好,謝謝你的回復!WSAEventSelect這個函式在哪兒用?有示例代碼嗎?
uj5u.com熱心網友回復:
"用一臺電腦控制多臺電腦打開PPT,在多個投影儀上演示PPT "我暈,我看了倒是被你這個應用場景勾住好奇心了

這是什么應用?聽起來好像很奇怪的樣子,呵呵
uj5u.com熱心網友回復:
再說下你這個心跳包的功能,何不自己基于TCP實作一個應用層的heartbeat功能。靠TCP的KEEPAVLIVE應該不靠譜的,再說了,你都斷網拔線了,退出了,TCP協議的RST/FIN已經觸發,哪里還有什么keepalive包。keepalive的定義是持續2小時不發任何包再給你來一個底層協議的心跳包而已uj5u.com熱心網友回復:
任何時候不要依賴于協議堆疊底層的心跳包來幫助你的業務層面的應用,KEEPAVLIVE只是tcp協議堆疊里面的維持他自己單個tcp 連接的狀態的,當這個socket被關閉了或者中間網路斷了導致一方關閉了這個KEEPAVLIVE就失效了。而且協議堆疊維持的這個定時器的周期太長,對你上層的判斷基本沒有任何的意義,最好就是自己實作一個簡單的收發包的,好除錯,時間間隔也可以自己來定uj5u.com熱心網友回復:
一種低成本的沉浸式投影效果展示。
uj5u.com熱心網友回復:

KEEPAVLIVE 我客戶端和服務端都設定了。自動心跳了。不會因為長時間不讀寫導致斷開。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/23478.html
標籤:網絡編程
上一篇:關于影像傅里葉變換的問題
