- 论坛徽章:
- 0
|
本帖最后由 chen1922 于 2016-03-20 16:17 编辑
初次接触asio,照着例子写了一个,链接的是echo_server
echo_server收到了发送的数据,也返回了.
问题1.io_service在resolver之前就run,为啥会提示boost::system 995错误
问题2.客户端异步发送了,但是没有异步读取。如果改成同步读取又能收到数据
帮忙看下是啥问题。- class Client
- {
- public:
- Client(boost::asio::io_service& io_service)
- : m_io_service(io_service)
- , m_socket(io_service)
- {
- }
- void doConnect(boost::asio::ip::tcp::resolver::iterator it)
- {
- boost::asio::async_connect(m_socket, it,
- [this](boost::system::error_code ec, boost::asio::ip::tcp::resolver::iterator)
- {
- if (!ec) {
- doRead();
- } else {
- std::cout << ec;
- }
- });
- }
- void doRead()
- {
- boost::asio::async_read(m_socket, boost::asio::buffer(m_buffer, 1024),
- [this](boost::system::error_code ec, std::size_t length)
- {
- if (!ec) {
- if (length > 0) {
- std::string s(m_buffer.data(), m_buffer.data() + length);
- std::cout << "read:" << s << "\n";
- }
- doRead();
- } else {
- std::cout << ec;
- m_socket.close();
- }
- });
- }
- void sendMsg(std::string s)
- {
- m_io_service.post([this, s]()
- {
- bool write_in_progress = !m_write_msgs.empty();
- m_write_msgs.push_back(s);
- if (!write_in_progress) {
- doWrite();
- }
- });
- }
- void doWrite()
- {
- boost::asio::async_write(m_socket,
- boost::asio::buffer(m_write_msgs.front().data(), m_write_msgs.front().length()),
- [this](boost::system::error_code ec, std::size_t /*length*/)
- {
- if (!ec) {
- m_write_msgs.pop_front();
- if (!m_write_msgs.empty()) {
- doWrite();
- }
- } else {
- m_socket.close();
- }
- });
- }
- boost::asio::io_service& m_io_service;
- boost::asio::ip::tcp::socket m_socket;
- std::array<char, 1024> m_buffer;
- std::list<std::string> m_write_msgs;
- };
- int main()
- {
- boost::asio::io_service io_service;
- boost::asio::io_service::work work(io_service);
- //问题1.如果在这里调用run函数,就会提示boost::system 995错误
- // std::thread t([&io_service]() { io_service.run(); });
- boost::asio::ip::tcp::resolver resolver(io_service);
- auto endpoint_it = resolver.resolve({IP, PORT});
- Client c(io_service);
- c.doConnect(endpoint_it);
- c.sendMsg("ssssss");
- //问题2.异步读没有收到,如果改成boost::asio::read_some可以收到数据
- std::thread t([&io_service]() { io_service.run(); });
- t.join();
-
- //system("pause");
- return 0;
- }
复制代码 |
|