读书人

asio 服务器解决办法

发布时间: 2012-09-25 09:55:59 作者: rapoo

asio 服务器
这是小弟利用asio(学了一上午)写的一个服务器,想问下一般的服务器是不是都这样框架?我写的代码有没有错误?

C/C++ code
#include<iostream>#include<string>#include<stdexcept>#include<boost/system/error_code.hpp>#include<boost/date_time/posix_time/posix_time.hpp>#include<boost/asio.hpp>#include<boost/smart_ptr.hpp>#include<boost/bind.hpp>#include<boost/thread.hpp>using std::endl;using std::cout;using std::cin;class TimeServent{public:    TimeServent(boost::asio::io_service & io_service):m_io_service(io_service),m_acceptor(m_io_service,boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(),5656))    {    }    void start();public:    void accept_handle(boost::system::error_code const & error_code,boost::shared_ptr<boost::asio::ip::tcp::socket> pSocket);    void write_handle(boost::system::error_code const & error_code,boost::shared_ptr<std::string> pString,boost::shared_ptr<boost::asio::ip::tcp::socket> pSocket);private:    boost::asio::io_service & m_io_service;    boost::asio::ip::tcp::acceptor m_acceptor;    boost::mutex  m_mutex;};void TimeServent::start(){    boost::shared_ptr<boost::asio::ip::tcp::socket> pSocket(new boost::asio::ip::tcp::socket(m_io_service));    m_acceptor.async_accept(*pSocket,boost::bind(&TimeServent::accept_handle,this,_1,pSocket));}void TimeServent::accept_handle(boost::system::error_code const & error_code,boost::shared_ptr<boost::asio::ip::tcp::socket> pSocket){    if(error_code)    {        boost::mutex::scoped_lock lock(m_mutex);        cout<<"error:"<<error_code.message()<<endl;        return;    }    {        boost::mutex::scoped_lock lock(m_mutex);        cout<<"client:"<<pSocket->remote_endpoint()<<endl;    }    boost::shared_ptr<std::string> pstring(new std::string(boost::posix_time::to_iso_extended_string(boost::posix_time::second_clock::local_time())));    pSocket->async_write_some(boost::asio::buffer(*pstring),boost::bind(&TimeServent::write_handle,this,_1,pstring,pSocket));    start();   }void TimeServent::write_handle(boost::system::error_code const & error_code,boost::shared_ptr<std::string> pString,boost::shared_ptr<boost::asio::ip::tcp::socket> pSocket){    if(error_code)    {        boost::mutex::scoped_lock lock(m_mutex);        cout<<"error:"<<error_code.message()<<endl;        return ;    }}int main(int argc,char ** argv){    try    {        boost::asio::io_service io_service;        TimeServent s(io_service);        cout<<"servent start "<<endl;        s.start();        unsigned int uiProcessNum=boost::thread::hardware_concurrency();        boost::thread_group thread_group;        for(unsigned int i=0;i<uiProcessNum*2;++i)        {            thread_group.create_thread(boost::bind(&(boost::asio::io_service::run),&io_service));        }        io_service.run();        thread_group.join_all();    }    catch(std::exception const & ex)    {        cout<<ex.what()<<endl;    }    return 0;}




[解决办法]
貌似正确,你写了一个简化的服务器,一般服务要复杂的多,基本原理不变。
没有写结束服务器的代码。
[解决办法]
你这程序能用来读写,没加密揭秘,没操作队列,没回调
[解决办法]
搭好了框架原型,你就可以往里面加功能了,建议加点注释。
[解决办法]
http://blog.csdn.net/yang79tao/article/details/7724514
[解决办法]
操作队列是这样的:你把收到的数据放到处理队列里面。然后用单独的线程来处理收到的数据,这样数据接收部分,和处理部分,就分开了。可读性和效率都能提高。 回调不太好举例,模块间调用,用的比较多 。

探讨

引用:
你这程序能用来读写,没加密揭秘,没操作队列,没回调

没有懂你的意思,加密,解密我知道,操队列,和回调是什么意思,能否详讲下?

[解决办法]
你的程序内存泄漏了,每个连接都会泄漏一个TimeServent实例……
[解决办法]
探讨

引用:
你的程序内存泄漏了,每个连接都会泄漏一个TimeServent实例……

这位大仙能否说得具体点?

读书人网 >C++

热点推荐