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

網絡服務器軟件開發/中間件開發,關注ACE/ICE/boost

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

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

#include 
"stdafx.h"

//禁止boost自動鏈接靜態庫
#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個字節才返回,可以和上面注釋的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)
    
{//可以考慮復雜應用,如:如何集成數據庫操作等
        
        
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長度才返回,如果由于網絡原因等導致長時間沒有讀全,則上面的定時器會做超時處理
                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));
//發起異步讀操作,以便后面正常退出
             }
            
        }

        
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"
      測試腳本中的內容可以靈活修改,用python寫這個實在是方便,比起用C++來寫,強多了。
      最后,歡迎大家到www.opensourceinsight.com交流哦,呵呵

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

Feedback

# re: Asio實現的實用echo server 2008-07-20 19:28 haskell
python做網絡測試確實不錯
c++的網絡庫一抓一大把,而且質量都不錯  回復  更多評論
  

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

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

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

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲国产综合91精品麻豆| 国产精品一区二区黑丝| 性高湖久久久久久久久| 亚洲国产精品专区久久| 欧美在线免费观看视频| 9i看片成人免费高清| 亚洲电影成人| 国产亚洲aⅴaaaaaa毛片| 欧美日韩一级片在线观看| 免费成人高清视频| 久久精品麻豆| 亚洲欧美日韩在线播放| 中日韩美女免费视频网址在线观看| 亚洲第一在线综合网站| 麻豆成人综合网| 久久久免费av| 久久久999| 欧美一级精品大片| 亚洲天堂av电影| 一本久道久久综合狠狠爱| 亚洲国产欧美日韩精品| 在线播放一区| 黄色日韩精品| 激情欧美一区| 国内自拍亚洲| 激情综合久久| 在线观看av一区| 一色屋精品视频在线看| 国产综合视频| 国产专区一区| 极品少妇一区二区三区| 国语自产精品视频在线看一大j8 | 国产在线观看91精品一区| 国产精品久久国产三级国电话系列| 欧美久久久久久久久| 欧美国产一区二区| 欧美精品手机在线| 欧美日韩一区二区三区在线观看免| 欧美区在线播放| 欧美日韩在线一区| 欧美午夜精品久久久久久浪潮| 欧美日韩国产在线看| 欧美人在线观看| 欧美天堂亚洲电影院在线观看| 国产精品va| 国产女主播一区二区| 国产综合欧美| 亚洲欧洲日本国产| 一级日韩一区在线观看| 亚洲欧美激情一区| 久久成人羞羞网站| 久久亚洲不卡| 亚洲黄页一区| 亚洲深夜福利| 久久精品2019中文字幕| 欧美+日本+国产+在线a∨观看| 欧美日本一区二区高清播放视频| 欧美日韩一区二区三区免费| 国产精品久久久久久久免费软件| 国产热re99久久6国产精品| 一区精品在线播放| 99国产精品久久久久久久久久| 亚洲一区一卡| 久久人人爽国产| 亚洲欧洲一区二区三区| 亚洲午夜一二三区视频| 久久精品视频在线观看| 欧美精品导航| 国产片一区二区| 亚洲国产日韩欧美| 亚洲欧美视频在线观看| 免费欧美日韩国产三级电影| 亚洲精品五月天| 欧美一级理论片| 欧美高清视频免费观看| 国产精品推荐精品| 91久久精品一区二区别| 午夜精品视频一区| 欧美激情欧美狂野欧美精品| 亚洲视频一区二区在线观看| 久久久精品动漫| 国产精品v欧美精品∨日韩| 黄色欧美日韩| 亚洲欧美日韩精品综合在线观看| 浪潮色综合久久天堂| 一区二区三区成人精品| 久久免费黄色| 国产精品一区二区欧美| 亚洲精品午夜精品| 久久精品国产96久久久香蕉| 91久久精品一区| 久久精品视频免费观看| 欧美午夜一区二区三区免费大片| 在线免费观看日本一区| 亚洲欧美国产va在线影院| 欧美激情一区二区三区在线视频 | 免费成人美女女| 国产区精品视频| 亚洲性图久久| 亚洲国产精品电影| 久久国产精品久久国产精品| 国产精品99免费看| 亚洲毛片在线看| 欧美成人免费在线| 欧美在线综合| 国产麻豆日韩| 亚洲欧美国产77777| 亚洲精品久久| 欧美成年人视频| 伊人久久亚洲美女图片| 欧美在线电影| 亚洲网站视频福利| 欧美日韩视频在线第一区| 亚洲精品一区二区三| 免费美女久久99| 久久久久一本一区二区青青蜜月| 国产视频不卡| 久久国产福利国产秒拍| 亚洲欧美国产高清| 国产精品腿扒开做爽爽爽挤奶网站| 一区二区三区三区在线| 亚洲精品久久久久久久久久久 | 国产日韩欧美自拍| 午夜免费日韩视频| 一区二区久久久久久| 欧美日一区二区三区在线观看国产免| 亚洲精品一品区二品区三品区| 欧美搞黄网站| 欧美高清视频一区二区| 亚洲精品一区二区三区福利| 亚洲高清电影| 欧美激情精品久久久久久变态| 亚洲精品久久在线| 最新日韩av| 欧美日韩亚洲系列| 亚洲一区在线观看免费观看电影高清 | 亚洲第一中文字幕| 欧美成人精品激情在线观看| 久久视频国产精品免费视频在线| 国产日韩精品入口| 久久久久久久久岛国免费| 久久国产66| 亚洲国产精品va在看黑人| 亚洲第一黄网| 欧美日韩系列| 性一交一乱一区二区洋洋av| 性18欧美另类| 亚洲电影在线观看| 91久久综合亚洲鲁鲁五月天| 欧美日韩免费观看一区=区三区| 亚洲最新视频在线播放| 亚洲视频免费在线观看| 国产日韩精品一区二区| 久久综合999| 美日韩精品免费| 在线亚洲欧美专区二区| 亚洲免费视频一区二区| 狠狠色丁香久久综合频道| 欧美激情自拍| 国产精品久久久久久久免费软件| 久久精品成人一区二区三区蜜臀| 久久久亚洲一区| 在线一区视频| 久久电影一区| 99亚洲视频| 欧美一区二区三区婷婷月色| 亚洲国产精选| 中文国产亚洲喷潮| 亚洲福利国产| 中国女人久久久| 亚洲成人影音| 亚洲少妇中出一区| 亚洲第一在线| 亚洲一区二区三区在线观看视频 | 欧美中文字幕视频在线观看| 亚洲日本va在线观看| 亚洲午夜精品一区二区| 亚洲大片精品永久免费| 亚洲视频在线视频| 亚洲第一狼人社区| 亚洲一区二三| 一本色道久久综合亚洲精品婷婷 | 久久视频在线视频| 欧美日韩国产综合视频在线观看中文| 久久国产免费| 欧美日韩午夜视频在线观看| 麻豆精品视频在线| 欧美性猛交99久久久久99按摩| 美国十次了思思久久精品导航| 国产精品高清在线| 亚洲福利av| 激情欧美亚洲| 亚洲免费在线观看| 一区二区三区久久精品| 久久久www免费人成黑人精品 | 欧美黄色一区| 国产综合在线看| 亚洲一区二区黄色| 一本色道久久| 欧美大片在线影院|