为什么这个简单的服务器不接受连接?
问题描述:
我刚刚开始使用boost asio并操纵我在线发现的一个简单服务器的代码片段。这里是代码为什么这个简单的服务器不接受连接?
void OnAccept(const boost::system::error_code & ec, boost::shared_ptr<boost::asio::ip::tcp::socket> sock)
{
if(ec)
{
std::cout << "[" << boost::this_thread::get_id()<< "] Error: " << ec << std::endl;
}
else
{
std::cout << "[" << boost::this_thread::get_id()<< "] Accepted!" << std::endl;
}
}
void RunServer()
{
boost::shared_ptr<boost::asio::io_service> io_service(new boost::asio::io_service);
boost::shared_ptr<boost::asio::ip::tcp::acceptor> acceptor(new boost::asio::ip::tcp::acceptor(*io_service));
boost::shared_ptr<boost::asio::ip::tcp::socket> sock(new boost::asio::ip::tcp::socket(*io_service));
try
{
boost::asio::ip::tcp::resolver resolver(*io_service);
boost::asio::ip::tcp::resolver::query query("127.0.0.1", boost::lexical_cast<std::string>(7777));
boost::asio::ip::tcp::endpoint endpoint = *resolver.resolve(query);
acceptor->open(endpoint.protocol());
acceptor->set_option(boost::asio::ip::tcp::acceptor::reuse_address(false));
acceptor->bind(endpoint);
acceptor->listen(boost::asio::socket_base::max_connections);
acceptor->async_accept(*sock, boost::bind(OnAccept, _1, sock));//Receives only one connection
std::cout << "Waiting for incoming connections \n";
while(true)
{
Sleep(400);
}
}
catch(std::exception & ex)
{
std::cout << "[" << boost::this_thread::get_id()<< "] Exception: " << ex.what() << std::endl;
}
}
int main(int argc, char * argv[])
{
boost::thread server(RunServer);
std::cout << "Press any key to stop..\n";
std::cin.get();
return 0;
}
代码不幸的是不接受连接。我试过telnet localhost 7777
但它不接受任何建议?
答
您正在开始异步接受,但您不允许io_service
运行。你需要做一个同步acecpt或致电io_service->run()
。相关部分将变为:
std::cout << "Waiting for incoming connections \n";
io_service->run();
}
我建议你比较Daytime.2 - A synchronous TCP daytime server和Daytime.3 - An asynchronous TCP daytime server
+0
是的,解决了这个问题 – MistyD 2013-03-21 19:30:00
如果你觉得这个问题可能是什么?它是否写出“等待传入连接”? – 2013-03-21 19:21:23
是的,它确实达到了这一点。但它从不接受连接。我认为它在RunServer()线程结束之后也强制它的子线程接受连接结束。因此,我在其中添加了一个while循环以保持活动 – MistyD 2013-03-21 19:26:14
@TAS指出,i0->服务将阻塞,直到完成所有任务。 – MistyD 2013-03-21 19:31:28