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

網(wǎng)絡(luò)服務(wù)器軟件開發(fā)/中間件開發(fā),關(guān)注ACE/ICE/boost

C++博客 首頁 新隨筆 聯(lián)系 聚合 管理
  152 Posts :: 3 Stories :: 172 Comments :: 0 Trackbacks

        關(guān)于echo的簡單server,幾乎多得發(fā)指,但大部分都沒有提供類似粘包,定時器,安全退出等開發(fā)中的常用機(jī)制,換句話說,為了echo而echo,借鑒價值大打折扣,畢竟我們平時的工作不可能這么簡單。這幾天研究了下asio,感覺不錯,boost接納asio后,在服務(wù)器開發(fā)領(lǐng)域是不是該得到重視呢:),還是貼代碼吧,有注釋
// asio.cpp : 定義控制臺應(yīng)用程序的入口點。
//

#include 
"stdafx.h"

//禁止boost自動鏈接靜態(tài)庫
#define BOOST_ALL_DYN_LINK

#include 
<cstdlib>
#include 
<iostream>
#include 
<boost/bind.hpp>
#include 
<boost/asio.hpp>
#include 
<boost/lexical_cast.hpp>

using boost::asio::ip::tcp;

class session
{
public:
    session(boost::asio::io_service
& io_service)
        : socket_(io_service),
        timer_(io_service),
        exit_flag_(
false)        
    
{
        std::cout 
<< "session born\n";
    }

    
~session()
    
{
        std::cout 
<< "session destroy\n";
    }


    tcp::socket
& socket()
    
{
        
return socket_;
    }


    
void start()
    
{//async_receive,async_read_some
        /*
        socket_.async_receive(boost::asio::buffer(data_, max_length),
            boost::bind(&session::handle_read, this,
            boost::asio::placeholders::error,
            boost::asio::placeholders::bytes_transferred));
            
*/

        
//讀到4個字節(jié)才返回,可以和上面注釋的sync_receive比較
        boost::asio::async_read(socket_,
            boost::asio::buffer(data_, 
4),
            boost::bind(
&session::handle_read, this,
            boost::asio::placeholders::error,
            boost::asio::placeholders::bytes_transferred
            ));
        
        size_t cancelcnt 
= timer_.expires_from_now(boost::posix_time::seconds(10));
        
//@return The number of asynchronous operations that were cancelled;第一次啟動定時器
        std::cout << "timer canceled count is = " << cancelcnt << std::endl;
        
        timer_.async_wait(boost::bind(
&session::handle_timeout,this,
            boost::asio::placeholders::error));        
    }


protected:

    
void handle_read(const boost::system::error_code& error,
        size_t bytes_transferred)
    
{//可以考慮復(fù)雜應(yīng)用,如:如何集成數(shù)據(jù)庫操作等
        
        
if (!error)
        
{
            
if (bytes_transferred < header_lenght)
            
{//處理正常退出
                std::cout << "need close\n";
                
this->handle_exit();
                delete 
this;
                
return;
            }

            
else if (bytes_transferred == header_lenght)//header
            {
                data_[bytes_transferred] 
= '\0';
                std::cout 
<< "packet len = " << data_ << std::endl;
                
int bodylen = boost::lexical_cast<int>(data_);
                boost::asio::async_read(socket_,
                    boost::asio::buffer(data_,bodylen),
                    boost::bind(
&session::handle_read,this,
                    boost::asio::placeholders::error,
                    boost::asio::placeholders::bytes_transferred));    
                
                
return;
            }

            
else
            
{//讀到了bodylen長度才返回,如果由于網(wǎng)絡(luò)原因等導(dǎo)致長時間沒有讀全,則上面的定時器會做超時處理
                if (bytes_transferred < max_length)
                
{
                    data_[bytes_transferred] 
= '\0';
                }

                std::cout 
<< data_ << std::endl;
                boost::asio::async_write(socket_,
                    boost::asio::buffer(data_, bytes_transferred),
                    boost::bind(
&session::handle_write, this,
                    boost::asio::placeholders::error));
                
//                 size_t cancelcnt = timer_.expires_from_now(boost::posix_time::seconds(10));
//                 std::cout << "timer canceled count is = " << cancelcnt << std::endl;
//                 timer_.async_wait(boost::bind(&session::handle_timeout,this,
//                      boost::asio::placeholders::error));                
                socket_.async_receive(boost::asio::buffer(data_, 1),
                    boost::bind(
&session::handle_read, this,
                    boost::asio::placeholders::error,
                    boost::asio::placeholders::bytes_transferred));
//發(fā)起異步讀操作,以便后面正常退出
             }
            
        }

        
else
        
{
            std::cout 
<< "error = " << error << "   bytes_transferred = " << bytes_transferred << std::endl;
            
this->handle_exit();
            delete 
this;//這句不能放在handle_exit里面,否則問題多多,沒找到好的解決方案
        }

    }


    
void handle_write(const boost::system::error_code& error)
    
{
        
if (!error)
        
{
            std::cout 
<< "handle_write ok\n";    
            
this->handle_exit();
        }

        
else
        
{
            std::cout 
<< "handle_write error\n";
        }
        
        
return;
    }

    
void handle_timeout(const boost::system::error_code& e)
    
{
        
if (e != boost::asio::error::operation_aborted)
        
{
            std::cout 
<< "timeout now.\n";    
            
this->handle_exit();
        }

        
else
        
{//被取消
            std::cout << "cancelled now.\n";
        }
            
        
return;
    }

    
void handle_exit()
    
{
        std::cout 
<< "enter handle_exit1.\n";        
        
if (!exit_flag_)
        
{
            std::cout 
<< "enter handle_exit2.\n";
            exit_flag_ 
= true;
            timer_.cancel();
            socket_.close();
            std::cout 
<< "after socket close.\n";
            
/*
            Any asynchronous send, receive
            or connect operations will be cancelled immediately, and will complete
            with the boost::asio::error::operation_aborted error
            
*/

            
//delete this;
            return;
        }

        
else
        
{
            
return;
        }

    }


private:
    tcp::socket socket_;    
    boost::asio::deadline_timer timer_;
    
bool exit_flag_;    
    
enum {header_lenght = 4,  max_length = 1024 };
    
char data_[max_length];
}
;

class server
{
public:
    server(boost::asio::io_service
& io_service, short port)
        : io_service_(io_service),
        acceptor_(io_service, tcp::endpoint(tcp::v4(), port))
    
{
        session
* new_session = new session(io_service_);
        acceptor_.async_accept(new_session
->socket(),
            boost::bind(
&server::handle_accept, this, new_session,
            boost::asio::placeholders::error));
    }


    
void handle_accept(session* new_session,
        
const boost::system::error_code& error)
    
{
        
if (!error)
        
{
            new_session
->start();
            new_session 
= new session(io_service_);
            acceptor_.async_accept(new_session
->socket(),
                boost::bind(
&server::handle_accept, this, new_session,
                boost::asio::placeholders::error));
        }

        
else
        
{
            delete new_session;
        }

    }


private:
    boost::asio::io_service
& io_service_;
    tcp::acceptor acceptor_;
}
;

int main(int argc, char* argv[])
{
    
try
    
{    
        boost::asio::io_service io_service;        
        server s(io_service, 
9000);

        io_service.run();
    }

    
catch (std::exception& e)
    
{
        std::cerr 
<< "Exception: " << e.what() << "\n";
    }


    
return 0;
}


      下面是python測試腳本:
      import socket,sys,time

host = sys.argv[1]
strPort = sys.argv[2]
sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
port = int(strPort)

try:
    sock.connect((host,port))
except socket.gaierror,e:
    print "addr error:%s" % e
    sys.exit(1)
   
except socket.error,e:
    print "connection error :%s" % e
    sys.exit(1)
   
try:
    pack = 'hello world!'
    packheader = '%04d' % len(pack)
    print "header : %s" % packheader
    sock.sendall(packheader)
    sock.sendall(pack)
    time.sleep(10)
    sock.sendall("hello world from python2!")
    recvbuf = sock.recv(1024)
    print "recv data : %s " % recvbuf
except socket.error,e:
    print "send data error : %s" % e
    sys.exit(1)
   
print "exit now"
      測試腳本中的內(nèi)容可以靈活修改,用python寫這個實在是方便,比起用C++來寫,強(qiáng)多了。
      最后,歡迎大家到www.opensourceinsight.com交流哦,呵呵

posted on 2008-07-20 13:45 true 閱讀(3705) 評論(3)  編輯 收藏 引用 所屬分類: boost通信技術(shù)

Feedback

# re: Asio實現(xiàn)的實用echo server 2008-07-20 19:28 haskell
python做網(wǎng)絡(luò)測試確實不錯
c++的網(wǎng)絡(luò)庫一抓一大把,而且質(zhì)量都不錯  回復(fù)  更多評論
  

# re: Asio實現(xiàn)的實用echo server 2008-08-21 15:24 roger007
this->handle_exit();
delete this;//這句不能放在handle_exit里面,否則問題多多,沒找到好的解決方案

=============
可以考慮使用boost的智能指針來解決這個問題,就不需要再考慮對象的delete了,具體可以參考ASIO的chat例子。
  回復(fù)  更多評論
  

# re: Asio實現(xiàn)的實用echo server 2009-05-11 15:19 zxh
我看了一下asio下的example\http2 其中創(chuàng)建了多個io_service放入多個線程來執(zhí)行run方法。 與http3這個例子中的多線程有什么區(qū)別,其中他使用了strand來同步線程,http2中沒有,我有些不太明白,還有不少疑問想請教一下你, 你加的QQ嗎?我的QQ:6346289  回復(fù)  更多評論
  

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久精品在线免费观看| 国产精品成人观看视频免费 | 亚洲欧美色一区| 欧美成人日韩| 女同一区二区| 亚洲精品国产系列| 亚洲另类自拍| 国产欧美日韩精品丝袜高跟鞋| 欧美一级精品大片| 亚洲欧美另类久久久精品2019| 国产乱码精品一区二区三区不卡| 欧美一区二区在线视频| 久久精品2019中文字幕| 亚洲国产精品999| 亚洲免费大片| 黄色工厂这里只有精品| 亚洲精品久久久久久下一站 | 午夜精品久久久久久久蜜桃app | 麻豆精品在线观看| 亚洲第一区在线| 亚洲另类视频| 激情六月婷婷综合| 日韩天堂在线观看| 国外成人在线| 夜夜狂射影院欧美极品| 国产日韩欧美成人| 亚洲裸体在线观看| 亚洲一区二区精品在线| 国内精品久久久| 99视频精品全国免费| 影音先锋中文字幕一区二区| 一本色道久久综合亚洲二区三区| 国语对白精品一区二区| 一区二区三区视频在线观看| 在线播放豆国产99亚洲| 亚洲女性喷水在线观看一区| 99国产精品久久久| 欧美激情亚洲| 亚洲精品久久视频| 亚洲九九精品| 欧美精品播放| 亚洲国产高清在线| 日韩视频一区二区| 欧美精品自拍偷拍动漫精品| 久久精品日产第一区二区| 国产欧美视频一区二区| 一本色道久久88亚洲综合88| 亚洲精品久久久久久久久| 久久久精品一区| 欧美韩日一区二区| 亚洲另类在线视频| 欧美精品成人在线| 一本久久综合亚洲鲁鲁五月天| 亚洲精品护士| 国产精品久久久久久久久久妞妞| 99热免费精品| 亚洲欧美在线免费| 亚洲国产小视频| 欧美国产高清| 亚洲资源在线观看| 久久精品99久久香蕉国产色戒 | 亚洲尤物视频在线| 久久五月激情| 亚洲影院在线| 久久国产手机看片| 亚洲欧洲综合另类在线| 亚洲乱码视频| 黄色精品在线看| 国产精品美女久久久免费| 美女精品网站| 久久久国产一区二区| 亚洲欧美国产三级| 日韩亚洲精品视频| 欧美激情区在线播放| 久久久一区二区三区| 久久国产精品一区二区三区| 999亚洲国产精| 亚洲精品视频在线播放| 亚洲国产精品一区二区第四页av | 久久国产加勒比精品无码| 欧美韩日亚洲| 美女诱惑黄网站一区| 久久夜色精品一区| 久久久精品五月天| 欧美在线观看视频一区二区三区 | 99精品欧美一区二区三区| 国产视频综合在线| 国产精品嫩草久久久久| 国产精品久久久久久久久久尿| 欧美aⅴ一区二区三区视频| 六月婷婷久久| 国产一区二区精品久久99| 一本色道久久综合亚洲精品高清 | 欧美一区二区大片| 欧美大成色www永久网站婷| 日韩视频亚洲视频| 欧美一区二区三区在线视频| 欧美精品久久一区二区| 好吊日精品视频| 在线欧美日韩国产| 亚洲电影一级黄| 久久久久久久999精品视频| 美国十次成人| 国产麻豆日韩| 亚洲国内精品在线| 99精品热6080yy久久| 一区二区三区视频观看| 欧美一区二区精品久久911| 久久激情中文| 亚洲美女精品成人在线视频| 欧美一区二区三区免费大片| 欧美精品电影| 亚洲黄色一区二区三区| 午夜在线成人av| 99在线视频精品| 免费亚洲视频| 一区二区在线免费观看| 久久久久久久久久久久久女国产乱| 欧美aaa级| 久久国产精品色婷婷| 国产精品每日更新| 在线视频免费在线观看一区二区| 久久婷婷人人澡人人喊人人爽| 在线一区二区三区四区五区| 六月婷婷久久| 亚洲精品日韩久久| 亚洲人成网站精品片在线观看| 久久av一区二区三区| 国产精品亚洲网站| 久久综合九色综合欧美狠狠| 欧美影院久久久| 伊人久久噜噜噜躁狠狠躁| 久久婷婷亚洲| 免费在线一区二区| 亚洲日本中文字幕免费在线不卡| 乱中年女人伦av一区二区| 久久偷看各类wc女厕嘘嘘偷窃| 影音先锋国产精品| 日韩视频一区二区三区在线播放| 免费成人毛片| 欧美偷拍另类| 美女网站在线免费欧美精品| 免费成人av资源网| 亚洲视频日本| 欧美一区二区成人| 一区二区三区导航| 亚洲一区激情| 日韩一区二区精品| 亚洲女人天堂av| 亚洲日产国产精品| 欧美在线看片a免费观看| 日韩系列在线| 久久影院午夜论| 午夜激情亚洲| 欧美成年人网| 久久夜色精品国产欧美乱极品| 国产精品jizz在线观看美国| 美女精品在线观看| 国语自产偷拍精品视频偷| 欧美一级久久久| 裸体丰满少妇做受久久99精品| 尤物精品在线| 欧美丰满高潮xxxx喷水动漫| 欧美国产丝袜视频| 亚洲二区在线观看| 性xx色xx综合久久久xx| 欧美一区二区精美| 国产在线视频欧美一区二区三区| 亚洲一区二区三区免费在线观看| 野花国产精品入口| 国产精品毛片va一区二区三区| 亚洲淫片在线视频| 久久精品一区二区三区四区| 韩国视频理论视频久久| 免费观看欧美在线视频的网站| 亚洲国产电影| 亚洲欧美日产图| 在线观看精品视频| 欧美视频三区在线播放| 午夜老司机精品| 欧美激情精品久久久久久大尺度| 亚洲一二三区在线观看| 狠狠色香婷婷久久亚洲精品| 欧美激情欧美激情在线五月| 亚洲一区黄色| 日韩西西人体444www| 老鸭窝毛片一区二区三区| 欧美激情第一页xxx| 亚洲影院免费观看| 一本大道久久a久久综合婷婷| 欧美一区二区三区四区在线观看地址 | 国产精品乱码| 欧美成人精品高清在线播放| 亚洲夜间福利| 亚洲福利精品| 免费欧美高清视频| 免费的成人av| 欧美不卡一卡二卡免费版| 欧美在线播放高清精品| 欧美在线视频一区二区三区|