免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2987 | 回复: 2
打印 上一主题 下一主题

[C++] Asio asyn_read没有被回调 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-03-20 16:16 |只看该作者 |倒序浏览
本帖最后由 chen1922 于 2016-03-20 16:17 编辑

初次接触asio,照着例子写了一个,链接的是echo_server
echo_server收到了发送的数据,也返回了.
问题1.io_service在resolver之前就run,为啥会提示boost::system 995错误
问题2.客户端异步发送了,但是没有异步读取。如果改成同步读取又能收到数据

帮忙看下是啥问题。
  1. class Client
  2. {
  3. public:
  4.     Client(boost::asio::io_service& io_service)
  5.         : m_io_service(io_service)
  6.         , m_socket(io_service)
  7.     {
  8.     }

  9.     void doConnect(boost::asio::ip::tcp::resolver::iterator it)
  10.     {
  11.         boost::asio::async_connect(m_socket, it,
  12.             [this](boost::system::error_code ec, boost::asio::ip::tcp::resolver::iterator)
  13.             {
  14.                 if (!ec) {
  15.                     doRead();
  16.                 } else {
  17.                     std::cout << ec;
  18.                 }
  19.             });
  20.     }

  21.     void doRead()
  22.     {
  23.         boost::asio::async_read(m_socket, boost::asio::buffer(m_buffer, 1024),
  24.             [this](boost::system::error_code ec, std::size_t length)
  25.             {
  26.                 if (!ec) {
  27.                     if (length > 0) {
  28.                         std::string s(m_buffer.data(), m_buffer.data() + length);
  29.                         std::cout << "read:" << s << "\n";
  30.                     }
  31.                     doRead();
  32.                 } else {
  33.                     std::cout << ec;
  34.                     m_socket.close();
  35.                 }
  36.             });
  37.     }

  38.     void sendMsg(std::string s)
  39.     {
  40.         m_io_service.post([this, s]()
  41.         {
  42.             bool write_in_progress = !m_write_msgs.empty();
  43.             m_write_msgs.push_back(s);
  44.             if (!write_in_progress) {
  45.                 doWrite();
  46.             }
  47.         });
  48.     }

  49.     void doWrite()
  50.     {
  51.         boost::asio::async_write(m_socket,
  52.             boost::asio::buffer(m_write_msgs.front().data(), m_write_msgs.front().length()),
  53.             [this](boost::system::error_code ec, std::size_t /*length*/)
  54.             {
  55.                 if (!ec) {
  56.                     m_write_msgs.pop_front();
  57.                     if (!m_write_msgs.empty()) {
  58.                         doWrite();
  59.                     }
  60.                 } else {
  61.                     m_socket.close();
  62.                 }
  63.             });
  64.     }

  65.     boost::asio::io_service&        m_io_service;
  66.     boost::asio::ip::tcp::socket    m_socket;
  67.     std::array<char, 1024>          m_buffer;
  68.     std::list<std::string>          m_write_msgs;
  69. };

  70. int main()
  71. {
  72.     boost::asio::io_service io_service;
  73.     boost::asio::io_service::work work(io_service);
  74. //问题1.如果在这里调用run函数,就会提示boost::system 995错误
  75. //    std::thread t([&io_service]() { io_service.run(); });

  76.     boost::asio::ip::tcp::resolver resolver(io_service);
  77.     auto endpoint_it = resolver.resolve({IP, PORT});

  78.     Client c(io_service);
  79.     c.doConnect(endpoint_it);


  80.     c.sendMsg("ssssss");
  81. //问题2.异步读没有收到,如果改成boost::asio::read_some可以收到数据

  82.     std::thread t([&io_service]() { io_service.run(); });
  83.     t.join();
  84.    
  85.     //system("pause");
  86.     return 0;
  87. }
复制代码

论坛徽章:
89
水瓶座
日期:2014-04-01 08:53:31天蝎座
日期:2014-04-01 08:53:53天秤座
日期:2014-04-01 08:54:02射手座
日期:2014-04-01 08:54:15子鼠
日期:2014-04-01 08:55:35辰龙
日期:2014-04-01 08:56:36未羊
日期:2014-04-01 08:56:27戌狗
日期:2014-04-01 08:56:13亥猪
日期:2014-04-01 08:56:02亥猪
日期:2014-04-08 08:38:58程序设计版块每日发帖之星
日期:2016-01-05 06:20:00程序设计版块每日发帖之星
日期:2016-01-07 06:20:00
2 [报告]
发表于 2016-03-20 16:31 |只看该作者
[this] 是什么意思啊,怎么从来没见过?

论坛徽章:
0
3 [报告]
发表于 2016-03-20 18:47 |只看该作者
回复 2# fender0107401


    lambda捕获当前类的指针,这样回调函数就能访问类的成员了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP