如何确定boost asyncaccept是否正在侦听端口

how to determine whether boost async_accept is listening on a port or not

本文关键字:何确定 boost asyncaccept 是否      更新时间:2023-10-16

我无法使此示例正常工作http://www.boost.org/doc/libs/1_61_0/doc/html/boost_asio/tutorial/tutdaytime3/src.html

我已经将端口13更改为1163,这样我就不需要成为root用户就可以开始侦听了。

我正在单独的线程中运行io_service

int main()
{
try
{
boost::asio::io_service io_service;
tcp_server server(io_service);
boost::thread t(boost::bind(&boost::asio::io_service::run, &io_service));
t.detach();
}
catch (std::exception& e)
{
std::cerr << e.what() << std::endl;
}
string wait;
cin >> wait;
return 0;
}

使用测试上述服务器时http://www.boost.org/doc/libs/1_61_0/doc/html/boost_asio/tutorial/tutdaytime1/src.html客户端,上面写着connection refused

netstat --listen在1163 上没有显示任何打开的端口

我不知道如何使用boost::asio::async_result<typename Handler>。我对Handler感到困惑。

工作修改

int main()
{
try
{
boost::asio::io_service io_service;
tcp_server server(io_service);
boost::thread t(boost::bind(&boost::asio::io_service::run, &io_service));
t.detach();
string wait;
cin >> wait;
}
catch (std::exception& e)
{
std::cerr << e.what() << std::endl;
}
return 0;
}

如果waittry块内,则代码工作!

如果asio无法侦听端口,则acceptor的创建或绑定将失败。在您的情况下,您使用acceptor_(io_service, tcp::endpoint(tcp::v4(), 13))创建接收器,这是一个过载:http://www.boost.org/doc/libs/1_62_0/doc/html/boost_asio/reference/basic_socket_acceptor/basic_socket_acceptor/overload3.html

这将直接尝试绑定套接字,如果失败则抛出异常。另一种选择(如本页底部所述)是在没有指定端点的情况下创建套接字,并在其上调用openbind,其中bind将因错误而失败(例如,如果套接字已在使用中)。在任何情况下,您都不需要等待accept/async_accept才能看到错误。

我想你的问题在于客户端程序,它仍然试图连接到端口13。你把它改成使用1163端口了吗?在示例代码中,端口不是直接写入的,但这里使用了一个众所周知的服务名称:tcp::resolver::query query(argv[1], "daytime");。"日间"参考将告诉解析器使用端口13。

更新:现在我看到了线程的实际代码,这是一个完全不同的错误:

如果wait不在try块内,那么asioio_servicetcp_server将几乎立即超出作用域,这意味着它们的析构函数将被调用。这将停止所有通信。更糟糕的是,分离的线程现在对一些悬空指针进行操作。一般来说,asio对象(io_service事件循环、套接字等)都应该存在于使用它们的线程中。io_service的生存期应与线程的生存期绑定或短于线程的生存时间。套接字的生存期应该比运行它们的事件循环(io_service)的生存期短。通过使用shared_ptr或在设计中投入大量思想,其他使用场景可能是可行的,但我不建议这样做。