青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

專職C++

不能停止的腳步

  C++博客 :: 首頁 :: 聯系 :: 聚合  :: 管理
  163 Posts :: 7 Stories :: 135 Comments :: 0 Trackbacks

常用鏈接

留言簿(28)

我參與的團隊

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/jimaliu/archive/2009/11/30/4908658.aspx


用戶異常掉線檢測
                                 David.Zhu  2005/6/1
   目前主要有三種方法來實現用戶掉線檢測:SO_KEEPALIVE ,SIO_KEEPALIVE_VALS 和Heart-Beat線程。
下面我就上面的三種方法來做一下介紹。
(1)SO_KEEPALIVE 機制
        這是socket庫提供的功能,設置接口是setsockopt API:
   BOOL  bSet=TRUE;
   setsockopt(hSocket,SOL_SOCKET,SO_KEEPALIVE,(const char*)&bSet,sizeof(BOOL));

       根據MSDN的文檔,如果為socket設置了KEEPALIVE選項,TCP/IP棧在檢測到對方掉線后,
   任何在該socket上進行的調用(發送/接受調用)就會立刻返回,錯誤號是WSAENETRESET ;
   同時,此后的任何在該socket句柄的調用會立刻失敗,并返回WSAENOTCONN錯誤。

   該機制的缺點也很明顯:
         默認設置是空閑2小時才發送一個“保持存活探測分節”,不能保證實時檢測!
   當然也可以修改時間間隔參數,但是會影響到所有打開此選項的套接口!
         關聯了完成端口的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操作,則馬上會失敗返回.


     該機制的缺點:
             不通用啦。MS的API只能用于Windows拉。不過,呵呵用彭博兄的評論就是:
     優雅一些^_^.
   
(3)Heart-Beat線程
        沒說的。自己寫一個后臺線程,實現Heart-Beat包,客戶端受到該包后,立刻返回相應的反饋  包。

    該方法的好處是通用,但缺點就是會改變現有的通訊協議!

有開發網絡應用經歷的人都知道,網絡中的接收和發送數據都是使用WINDOWS中的SOCKET進行實現。但是如果此套接字已經斷開,那發送數據和接收數據的時候就一定會有問題。可是如何判斷這個套接字是否還可以使用呢?

  有人一定想到使用Send函數中的返回結果來進行判斷。如果返回的長度和自己發送出去的長度一致,那就說明這個套接字是可用的,否則此套接字一定出現了問題。但是我們并不是無時無刻的發送數據呀。如何解決呢?

  其實TCP中已經為我們實現了一個叫做心跳的機制。如果你設置了心跳,那TCP就會在一定的時間(比如你設置的是3秒鐘)內發送你設置的次數的心跳(比如說2次),并且此信息不會影響你自己定義的協議。

  在VC中實現心跳的例子很多,可是在DLEPHI中一直沒有相應的代碼。下面我是我使用DELPHI編寫的關于心跳的代碼(以IOCP為例),希望對大家有幫助。

定義心跳常量

const
  IOC_IN               =$80000000;
  IOC_VENDOR           =$18000000;
  IOC_out              =$40000000;
  SIO_KEEPALIVE_VALS   =IOC_IN or IOC_VENDOR or 4;

var

  inKeepAlive,OutKeepAlive:TTCP_KEEPALIVE;

實現代碼是在Acceptsc:= WSAAccept(Listensc, nil, nil, nil, 0);代碼的后面加入:

      opt:=1;
      if setsockopt(Acceptsc,SOL_SOCKET,SO_KEEPALIVE,@opt,sizeof(opt))=SOCKET_ERROR then
      begin
        closesocket(Acceptsc);
      end;
      inKeepAlive.onoff:=1;
      //設置3秒鐘時間間隔

  inKeepAlive.keepalivetime:=3000;

      //設置每3秒中發送1次的心跳
      inKeepAlive.keepaliveinterval:=1;
      insize:=sizeof(TTCP_KEEPALIVE);
      outsize:=sizeof(TTCP_KEEPALIVE);
      if WSAIoctl(Accept,SIO_KEEPALIVE_VALS,@inKeepAlive,insize,@outKeepAlive,outsize,@outByte,nil,nil)=SOCKET_ERROR then
      begin
        closesocket(Acceptsc);
      end;

如果加入以上的代碼以后,系統會每3秒中加入一次的心跳。并且如果客戶端斷線以后(網線斷),函數GetQueuedCompletionStatus會返回FALSE。

if (GetQueuedCompletionStatus(CompletionPort, BytesTransferred,DWORD(PerHandleData), POverlapped(PerIoData), INFINITE) = False) then
        begin
           //在這里處理客戶端斷線信息。

   continue;
        end;

以上就是我使用心跳的方法,此方法我已經在我的網絡游戲中使用。情況穩定!

 

本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/jimaliu/archive/2009/11/30/4908658.aspx

posted on 2010-11-25 17:09 冬瓜 閱讀(1191) 評論(0)  編輯 收藏 引用 所屬分類: 轉貼
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            9i看片成人免费高清| 亚洲国产人成综合网站| 欧美在线视频一区| 欧美一级视频免费在线观看| 性色av一区二区三区在线观看| 一区二区三区四区五区在线| 亚洲女同在线| 久久嫩草精品久久久精品一| 欧美高清视频| 国产精品久久久久久久久久直播| 国产精品中文字幕欧美| 狠狠色狠狠色综合日日五| 亚洲激情网站| 亚洲在线中文字幕| 久久中文字幕一区二区三区| 亚洲第一黄色网| 欧美寡妇偷汉性猛交| 亚洲美女诱惑| 久久精品中文字幕一区| 欧美精品成人在线| 国产亚洲精品aa| 亚洲精品系列| 久久av一区二区三区漫画| 欧美国产日本高清在线| 亚洲午夜性刺激影院| 久久久久久999| 国产精品第一区| 狠狠狠色丁香婷婷综合久久五月| 夜夜狂射影院欧美极品| 久久午夜羞羞影院免费观看| 一区二区三区产品免费精品久久75| 久久成人综合视频| 国产精品mv在线观看| 亚洲人成7777| 久久这里有精品视频| 亚洲一区二区不卡免费| 欧美韩日一区二区| 一区二区三区在线视频免费观看 | 极品少妇一区二区三区精品视频 | 久久米奇亚洲| 中国成人黄色视屏| 欧美大尺度在线观看| 国产亚洲网站| 午夜一级在线看亚洲| 日韩午夜一区| 欧美激情中文不卡| 亚洲国产一成人久久精品| 久久精品欧美日韩| 亚洲已满18点击进入久久| 欧美片第一页| 99re66热这里只有精品4| 免费成人黄色av| 欧美在线精品一区| 国产午夜精品一区理论片飘花| 在线视频日韩| 日韩一二在线观看| 欧美三级电影网| 一区二区三区免费看| 亚洲娇小video精品| 免费不卡在线观看av| 亚洲丁香婷深爱综合| 免费在线国产精品| 久久亚洲欧美| 亚洲日本国产| 亚洲精品一线二线三线无人区| 噜噜噜在线观看免费视频日韩| 精品91视频| 欧美成人午夜激情在线| 蜜桃精品一区二区三区| 亚洲精品社区| 99在线热播精品免费99热| 欧美性猛片xxxx免费看久爱| 亚洲一区三区视频在线观看| 亚洲一区二区在线| 国产亚洲精品v| 欧美成人三级在线| 欧美日韩dvd在线观看| 亚洲一区二区在| 欧美一区二区视频在线观看2020 | 欧美性猛交xxxx乱大交蜜桃| 亚洲图片你懂的| 亚洲自拍偷拍色片视频| 国产婷婷97碰碰久久人人蜜臀| 久久免费偷拍视频| 欧美高清在线一区| 亚洲免费在线视频| 久久久国产精品一区二区三区| 亚洲精品久久久一区二区三区| 一本色道久久综合狠狠躁篇怎么玩| 国产麻豆午夜三级精品| 免费看精品久久片| 国产精品v亚洲精品v日韩精品| 久久国产综合精品| 宅男噜噜噜66一区二区66| 亚洲视频精品在线| 一区二区三区在线看| 亚洲人成绝费网站色www| 国产精品久久久久aaaa| 久久只有精品| 国产精品久久99| 欧美成人在线免费观看| 欧美视频第二页| 欧美91大片| 国产乱理伦片在线观看夜一区| 欧美激情一区二区三区不卡| 欧美午夜不卡| 欧美成人伊人久久综合网| 国产精品一区二区a| 亚洲电影自拍| 国产综合网站| 一区二区三区四区五区视频| **欧美日韩vr在线| 亚洲一区二三| 一区二区日本视频| 男女精品视频| 久久综合久色欧美综合狠狠 | 午夜一区在线| 欧美日韩hd| 欧美国产视频日韩| 韩日成人av| 欧美亚洲日本一区| 欧美一区二区三区婷婷月色| 欧美日韩视频一区二区| 亚洲第一在线视频| 尤物99国产成人精品视频| 午夜天堂精品久久久久| 亚洲欧美成人一区二区三区| 欧美日本一区二区高清播放视频| 欧美xxx成人| 亚洲第一在线综合网站| 久久免费99精品久久久久久| 久久久人成影片一区二区三区观看 | 欧美自拍偷拍午夜视频| 欧美性开放视频| 一区二区三区日韩| 亚洲女人av| 国产精品视频自拍| 亚洲一区二区久久| 午夜亚洲一区| 国产日韩欧美一区二区| 午夜视频久久久| 久久全国免费视频| 在线不卡a资源高清| 老牛嫩草一区二区三区日本| 六月婷婷一区| 亚洲人成亚洲人成在线观看| 欧美大秀在线观看| 亚洲精品影视| 性色av一区二区三区| 国产欧美日韩在线 | 亚洲美女在线国产| 亚洲线精品一区二区三区八戒| 欧美久久视频| 国产婷婷色综合av蜜臀av| 欧美高清视频www夜色资源网| 美女日韩欧美| 日韩五码在线| 国产精品夜夜夜| 久久精品视频一| 欧美成人在线网站| 在线一区二区三区做爰视频网站| 欧美日韩一区二区免费在线观看| 亚洲视频一起| 久久久噜噜噜久久中文字免| 亚洲国产另类久久久精品极度| 欧美区一区二| 欧美一区二区国产| 亚洲国产日韩欧美在线99| 亚洲午夜高清视频| 国内久久婷婷综合| 欧美另类综合| 欧美一区二视频| 亚洲国产另类久久精品| 亚洲一区二区三区涩| 国产专区精品视频| 欧美日韩不卡合集视频| 欧美一二区视频| 亚洲巨乳在线| 六月婷婷一区| 亚洲欧美综合国产精品一区| 在线观看三级视频欧美| 国产精品国产| 欧美韩日亚洲| 久久精品五月| 亚洲影视综合| 亚洲三级电影全部在线观看高清| 欧美一级播放| 一区二区三区久久久| 樱桃国产成人精品视频| 国产精品普通话对白| 欧美黑人一区二区三区| 久久国产高清| 亚洲免费视频网站| 日韩西西人体444www| 欧美成人一区在线| 久久久久久久综合色一本| 亚洲综合日本| 99精品视频免费全部在线| 在线视频国产日韩| 在线观看一区欧美|