• <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>
            posts - 311, comments - 0, trackbacks - 0, articles - 0
              C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

              前面一直都在說接收數據時的處理方法,我們應該用專門的IO線程,接收到完整的消息包后加入到主線程的消息隊列,但是主線程如何發送數據還沒有探討過。



              一般來說最直接的方法就是邏輯線程什么時候想發數據了就直接調用相關的socket API發送,這要求服務器的玩家對象中保存其連接的socket句柄。但是直接send調用有時候有會存在一些問題,比如遇到系統的發送緩沖區滿而阻塞住的情況,或者只發送了一部分數據的情況也時有發生。我們可以將要發送的數據先緩存一下,這樣遇到未發送完的,在邏輯線程的下一次處理時可以接著再發送。

              考慮數據緩存的話,那這里這可以有兩種實現方式了,一是為每個玩家準備一個緩沖區,另外就是只有一個全局的緩沖區,要發送的數據加入到全局緩沖區的時候同時要指明這個數據是發到哪個socket的。如果使用全局緩沖區的話,那我們可以再進一步,使用一個獨立的線程來處理數據發送,類似于邏輯線程對數據的處理方式,這個獨立發送線程也維護一個消息隊列,邏輯線程要發數據時也只是把數據加入到這個隊列中,發送線程循環取包來執行send調用,這時的阻塞也就不會對邏輯線程有任何影響了。

              采用第二種方式還可以附帶一個優化方案。一般對于廣播消息而言,發送給周圍玩家的數據都是完全相同的,我們如果采用給每個玩家一個緩沖隊列的方式,這個數據包將需要拷貝多份,而采用一個全局發送隊列時,我們只需要把這個消息入隊一次,同時指明該消息包是要發送給哪些socket的即可。有關該優化的說明在云風描述其連接服務器實現的blog文章中也有講到,有興趣的可以去閱讀一下。
            久久国产亚洲精品| 久久精品一区二区三区不卡| 久久综合给合久久国产免费| 成人国内精品久久久久影院| 亚洲国产精品久久久久婷婷软件| 久久综合精品国产一区二区三区| 无码日韩人妻精品久久蜜桃| 国产精品亚洲美女久久久| 久久精品中文字幕无码绿巨人| 日本久久中文字幕| 久久99精品久久久久久9蜜桃| 久久99国产乱子伦精品免费| 久久人人爽人人爽人人片av麻烦 | 久久精品三级视频| 国内精品久久久久影院优| 精品久久久久久久久中文字幕| 久久久精品日本一区二区三区| 久久精品中文无码资源站| 国产成人无码精品久久久久免费| 婷婷国产天堂久久综合五月| 色综合久久综精品| 久久国产精品一国产精品金尊| 久久无码国产| 国产精品久久久久久久久久免费| 亚洲中文精品久久久久久不卡| 久久精品国产亚洲AV香蕉| 国产成人精品久久| 青青草国产成人久久91网| 蜜臀av性久久久久蜜臀aⅴ麻豆| 亚洲乱码日产精品a级毛片久久 | 久久久久亚洲av成人无码电影| 成人国内精品久久久久一区| 伊人久久综合无码成人网| 一本色道久久88综合日韩精品 | 欧美精品福利视频一区二区三区久久久精品 | 久久精品人人做人人爽97| 国产亚洲精品久久久久秋霞| 一级做a爰片久久毛片毛片| 欧美激情精品久久久久久久| 理论片午午伦夜理片久久| 亚洲午夜无码AV毛片久久|