c++ - ASIO 库 - 未调用处理程序

标签 c++ unix boost boost-asio

我对 ASIO boost 库有疑问。问题是异步函数。

这是简单的服务器代码。

void handle_accept( const boost::system::error_code& error )
{
    std::cout << "Someone connected" << std::endl;
}

void handle_read( const boost::system::error_code& error )
{
    printf( "Message: %s \n", somedata);
}

int main()
{

std::cout << "Starting server ....\n" << std::endl;

try
{
    boost::asio::io_service io_service;
    tcp::socket  mysocket(io_service);
    tcp::acceptor myacceptor(io_service, tcp::endpoint(tcp::v4(), 5000));

    myacceptor.async_accept( mysocket, boost::bind( &handle_accept, boost::asio::placeholders::error));
    mysocket.async_receive(  boost::asio::buffer(somedata, 1024)  , boost::bind( &handle_read, boost::asio::placeholders::error) );
    io_service.run();

    std::cout << "END. \n" << std::endl;
    sleep(5);

}  catch (std::exception& e)
{
  std::cerr << "Exception: " << e.what() << "\n";
}
return 0;

这里是客户端代码

int main()
{
std::cout << "Starting client ....\n" << std::endl;

try
{
boost::asio::io_service io_service;

tcp::resolver resolver(io_service);
tcp::resolver::query query(tcp::v4(), "localhost", "5000");
tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);
tcp::socket mysocket(io_service);

boost::asio::connect(mysocket, endpoint_iterator);

sleep(5);
sprintf( somedata, "This is a message i sent.");
mysocket.send( boost::asio::buffer(somedata, 1024)  );

}  catch (std::exception& e)
{
  std::cerr << "Exception: " << e.what() << "\n";
}
return 0;
}

所以,它应该如何工作。服务器应该等待来自客户端的连接,当客户端连接时,它应该调用 handle_accept。当客户端连接时,实际上调用了 handle_accept,但即使没有收到数据它也会调用 handle_read !为什么 ?客户端在建立连接后 5 秒后发送数据。

非常感谢。

最佳答案

接收立即完成,因为它不能等待,因为它没有什么可等待的。 TCP 监听套接字永远不会接收到任何数据。仅在连接的套接字上调用 async_receive

关于c++ - ASIO 库 - 未调用处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12520802/

相关文章:

c++ - 使用 Visual Studio 2010 时出现错误/不正确的 C2248 错误

c++ - 在类中分配和使用公共(public)变量

c++ - 将命名参数和捆绑属性与 edmonds_karp_max_flow() 结合使用

linux - 创建命令以转到特定快捷方式

c++ - 命名空间 'vsnprintf' 中没有名为 'std' 的成员;你是说 'vsprintf' 吗?

c++ - 初始化指针数组

Bash 脚本使用 Grep 在文件中搜索模式

linux - 使用 sed 删除一段文本

c++ - 无法编译摩西(对 boost::... 的 undefined reference )

C++ 单个字符未通过套接字发送