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

網絡服務器軟件開發/中間件開發,關注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 閱讀(3705) 評論(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>
            欧美黄色aaaa| 中文网丁香综合网| 亚洲免费一级电影| 亚洲影院免费观看| 久久久国产精品一区| 亚洲一区免费| 欧美一二三视频| 久久人体大胆视频| 欧美高清视频一区| 欧美涩涩网站| 国产欧美韩国高清| 黄网站免费久久| 亚洲精华国产欧美| 一区二区久久| 久久精品国产清自在天天线| 免费av成人在线| 亚洲欧洲另类国产综合| 亚洲深夜激情| 久久久久久亚洲精品杨幂换脸| 久久午夜精品| 欧美色偷偷大香| 精品999日本| 在线视频日本亚洲性| 久久国产精品黑丝| 欧美成ee人免费视频| 一本到高清视频免费精品| 欧美在线精品一区| 国产精品福利久久久| 亚洲国产精品成人精品| 亚洲综合色视频| 亚洲国产一区二区视频| 亚洲综合第一页| 欧美日本不卡| 亚洲第一网站| 久久精品视频在线播放| 日韩一区二区精品在线观看| 欧美中文在线观看国产| 欧美日韩国产一区| 91久久中文| 另类欧美日韩国产在线| 亚洲视频欧洲视频| 欧美日本国产精品| 最近中文字幕mv在线一区二区三区四区| 午夜日韩在线观看| 艳女tv在线观看国产一区| 久久免费国产精品| 狠狠色综合网站久久久久久久| 香港成人在线视频| 在线亚洲精品| 国产精品久久久久久久久| 一区二区三区欧美| 日韩网站在线观看| 欧美精品日韩精品| 亚洲自拍偷拍网址| 国产精品视频一| 午夜精品久久久久久久99热浪潮| 日韩一级在线| 欧美性片在线观看| 午夜日韩视频| 欧美在线观看日本一区| 欧美精品粉嫩高潮一区二区| 久久久久欧美| 日韩视频在线免费观看| 欧美99久久| 亚洲精品国产精品国自产在线| 久久综合九色综合欧美狠狠| 欧美一区二区黄| 国产亚洲欧美日韩在线一区| 性久久久久久久| 欧美一区二区三区啪啪| 国产一区二区三区免费不卡| 久久视频国产精品免费视频在线| 欧美一区网站| 精品福利电影| 亚洲娇小video精品| 欧美视频福利| 欧美一区二区三区视频免费| 欧美亚洲免费高清在线观看| 国产亚洲一区精品| 欧美成人精品不卡视频在线观看| 麻豆av福利av久久av| 日韩午夜高潮| 亚洲在线播放| 亚洲国产精品成人久久综合一区| 亚洲黄色一区二区三区| 欧美视频观看一区| 久久久久久9| 你懂的国产精品永久在线| 在线亚洲精品| 久久久www成人免费无遮挡大片| 亚洲欧洲在线看| 亚洲欧美另类中文字幕| 亚洲国产欧美一区二区三区丁香婷| 日韩亚洲欧美成人一区| 国产欧美日韩综合一区在线观看 | 亚洲大片精品永久免费| 亚洲国产91| 国产精品理论片| 欧美国产极速在线| 国产欧美一区二区色老头| 欧美黄色aa电影| 国产精品丝袜白浆摸在线| 国产精品美女久久久久av超清 | 亚洲老板91色精品久久| 一本色道久久| 亚洲精品久久嫩草网站秘色| 午夜性色一区二区三区免费视频| 亚洲精品1区2区| 欧美一区二区在线播放| 一本大道av伊人久久综合| 久久精品导航| 午夜精品一区二区三区在线播放| 麻豆av一区二区三区| 久久久综合网| 国产日韩三区| 亚洲小视频在线| 日韩视频在线你懂得| 久久久久久久一区| 亚洲欧美日韩在线播放| 老司机精品视频网站| 欧美在线首页| 欧美图区在线视频| 亚洲二区视频在线| 激情久久综艺| 欧美一进一出视频| 欧美亚洲专区| 国产精品扒开腿做爽爽爽视频 | 中文一区在线| 欧美激情乱人伦| 麻豆精品传媒视频| 国语自产偷拍精品视频偷| 亚洲综合色网站| 欧美一级黄色网| 国产欧美日韩综合| 欧美在线|欧美| 可以看av的网站久久看| 影音先锋久久资源网| 久久男人资源视频| 亚洲二区在线| 亚洲天堂av高清| 国产精品国产精品| 亚洲欧美另类在线| 狂野欧美性猛交xxxx巴西| 尤物精品国产第一福利三区| 欧美一区午夜精品| 猫咪成人在线观看| 亚洲国产美女精品久久久久∴| 免费欧美日韩国产三级电影| 亚洲国产欧美在线人成| 99精品国产高清一区二区| 欧美日韩一区二区在线播放| 亚洲一区二区三区乱码aⅴ蜜桃女| 久久久xxx| 欧美国产日本在线| 99av国产精品欲麻豆| 国产精品久久91| 午夜亚洲福利| 欧美激情视频网站| 亚洲网友自拍| 国产欧美一区二区精品秋霞影院 | 亚洲精品国产精品国自产在线| 欧美激情一区二区三区蜜桃视频| 亚洲乱码国产乱码精品精| 亚洲一区二区三| 国产亚洲一区精品| 欧美成人一区二区三区| 一区二区av在线| 欧美中文字幕视频| 最新精品在线| 国产精品视频免费观看www| 久久久久久伊人| 亚洲最新视频在线| 另类春色校园亚洲| 亚洲一区二区三区成人在线视频精品 | 日韩午夜精品视频| 久久精品国产亚洲一区二区三区 | 国产手机视频一区二区| 亚洲精品久久视频| 亚洲人成网站精品片在线观看| 欧美日韩一区成人| 亚洲精品中文字幕女同| 久久亚洲视频| 日韩视频一区二区| 欧美一区二区日韩| 国产精品久久久久天堂| 日韩亚洲欧美在线观看| 久久五月激情| 午夜一区不卡| 国产精品户外野外| 欧美高清在线观看| 欧美在线精品免播放器视频| 激情欧美丁香| 亚洲成人资源| 亚洲一区观看| 亚洲激情自拍| 国产一级揄自揄精品视频| 久久精品国产第一区二区三区| 亚洲日本欧美在线| 精品99一区二区| 国内精品久久久久久影视8|