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实例……
[解决办法]