i'm writing small server, can parse xml files , send pieces of information clients (os windows server 2008 r2).
server
for passing io_service parameter methods, use boost::shared_ptr:
typedef boost::shared_ptr<io_service> service_ptr; ... _service_ptr = boost::make_shared<io_service>(); clients accepting thread:
void accept_thread(serverconfig const& config) { try { while(!_data_.isvalid()) { std::cout << "wait complete data..." << std::endl; boost::this_thread::sleep( millisec(500)); } while (true) { _pool.waitnewclient(_service_ptr); } } catch(std::exception& e) { log::write(log_err, std::string("in accept thread: ") + e.what()); std::cerr << "in accept thread: " << e.what() << std::endl; } } accepting next client:
void cclientpool::waitnewclient(service_ptr& serv_ptr) { client_ptr new_( new talk_to_client(serv_ptr)); _acceptor.accept(new_); boost::lock_guard<boost::mutex> lk(*_mutex);// safe lock clients new_->reset_last_ping(); clients.push_back(new_); log::write(log_inf, "connected new client."); std::cout << "connected new client." << std::endl; } and:
void cclientacceptor::init(int port, service_ptr& serv_ptr) { acceptor_ptr_ = boost::make_shared<ip::tcp::acceptor>(*serv_ptr, ip::tcp::endpoint(ip::tcp::v4(), port) ); } void cclientacceptor::accept(client_ptr& cl_ptr) { acceptor_ptr_->accept( cl_ptr->sock()); } ,where acceptor_ptr_:
typedef boost::shared_ptr<ip::tcp::acceptor> acceptor_ptr; ... acceptor_ptr acceptor_ptr_; client
void connect(std::string const& host, int port, boost::shared_ptr<boost::asio::io_service>& service) { if(connected_){ disconnect(); } sock_.reset(new ip::tcp::socket(*service)); boost::system::error_code ec; ep = boost::asio::ip::tcp::endpoint(ip::address::from_string(host), port); // while not connection int attempt = 0; { if(attempt++ > 0) { std::cerr << "attempt reconnect #" << attempt << "..." << std::endl; } sock_->connect(ep, ec); if(ec){ std::cerr << "failed connection server: " << ec.message() << std::endl; boost::this_thread::sleep(boost::posix_time::millisec(1000)); } } while(ec); connected_ = true; } void disconnect() { if(sock_) { boost::system::error_code errorcode; if(sock_->is_open()) { sock_->shutdown(boost::asio::ip::tcp::socket::shutdown_both, errorcode); if (errorcode) { std::cerr << "socket.shutdown error: " << errorcode.message() << std::endl; } sock_->close(errorcode); if (errorcode) { std::cerr << "socket.close error: " << errorcode.message() << std::endl; } } sock_.reset(); } connected_ = false; } when debug program (starting , stopping server/clients), there point when server stops accepting clients. while connecting client runs without errors, server not accept client anymore. after changing port problem disappears. problem?
Comments
Post a Comment