對方網絡非正常斷開檢測方法
睿豐德科技 專注RFID識別技術和條碼識別技術與管理軟件的集成項目。質量追溯系統、MES系統、金蝶與條碼系統對接、用友與條碼系統對接
windows下
此處的”非正常斷開”指TCP連接不是以優雅的方式斷開,如網線故障等物理鏈路的原因,還有突然主機斷電等原因 有兩種方法可以檢測:1.TCP連接雙方定時發握手消息 2.利用TCP協議棧中的KeepAlive探測 第二種方法簡單可靠,只需對TCP連接兩個Socket設定KeepAlive探測, 所以本文只講第二種方法在Linux,Window2000下的實現(在其它的平臺上沒有作進一步的測試) Windows 2000平臺下 頭文件 #include <mstcpip.h> //定義結構及宏 struct TCP_KEEPALIVE { u_longonoff; u_longkeepalivetime; u_longkeepaliveinterval; } ; 1. tcp_keepalive live,liveout; 2. live.keepaliveinterval=500; 3. live.keepalivetime=3000; 4. live.onoff=TRUE; 5. int iRet = setsockopt(Socket,SOL_SOCKET,SO_KEEPALIVE,(char *)Opt,sizeof(int)); 6. if(iRet == 0){ 7. 8. DWORD dw; 9. 10. if(WSAIoctl(Socket,SIO_KEEPALIVE_VALS,&live,sizeof(live),&liveout,sizeof(liveout),&dw,NULL,NULL)== SOCKET_ERROR){ 11. 12. //Delete Client 13. 14. return; 15. } 16. } ACE下代碼 //by rainfish blog.csdn.net/bat603 int Opt = 1; //在測試過程中,發現檢測的次數是5次,即下面的設置中,從最近一次消息開始計算的10秒后,每次間隔5秒,連續發送5次,即 //35秒發現網絡斷了 tcp_keepalive live,liveout; live.keepaliveinterval=5000; //每次檢測的間隔 (單位毫秒) live.keepalivetime=10000; //第一次開始發送的時間(單位毫秒) live.onoff=TRUE; int iRet = stream.set_option(SOL_SOCKET,SO_KEEPALIVE,&Opt,sizeof(int)); if(iRet == 0){ DWORD dw; //此處顯示了在ACE下獲取套接字的方法,即句柄的(SOCKET)化就是句柄 if(WSAIoctl((SOCKET)h,SIO_KEEPALIVE_VALS,&live,sizeof(live),&liveout,sizeof(liveout),&dw,NULL,NULL)== SOCKET_ERROR){ //Delete Client return; } } Linux平臺下 #include "/usr/include/linux/tcp.h" #include "/usr/include/linux/socket.h" ////KeepAlive實現,單位秒 //下面代碼要求有ACE,如果沒有包含ACE,則請把用到的ACE函數改成linux相應的接口 int keepAlive = 1;//設定KeepAlive int keepIdle = 5;//開始首次KeepAlive探測前的TCP空閉時間 int keepInterval = 5;//兩次KeepAlive探測間的時間間隔 int keepCount = 3;//判定斷開前的KeepAlive探測次數 if(setsockopt(s,SOL_SOCKET,SO_KEEPALIVE,(void*)&keepAlive,sizeof(keepAlive)) == -1) { ACE_DEBUG ((LM_INFO, ACE_TEXT ("(%P|%t) setsockopt SO_KEEPALIVE error!/n"))); } if(setsockopt(s,SOL_TCP,TCP_KEEPIDLE,(void *)&keepIdle,sizeof(keepIdle)) == -1) { ACE_DEBUG ((LM_INFO, ACE_TEXT ("(%P|%t) setsockopt TCP_KEEPIDLE error!/n"))); } if(setsockopt(s,SOL_TCP,TCP_KEEPINTVL,(void *)&keepInterval,sizeof(keepInterval)) == -1) { ACE_DEBUG ((LM_INFO, ACE_TEXT ("(%P|%t) setsockopt TCP_KEEPINTVL error!/n"))); } if(setsockopt(s,SOL_TCP,TCP_KEEPCNT,(void *)&keepCount,sizeof(keepCount)) == -1) { ACE_DEBUG ((LM_INFO, ACE_TEXT ("(%P|%t)setsockopt TCP_KEEPCNT error!/n"))); }RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成