- 論壇徽章:
- 0
|
本帖最后由 chen1922 于 2016-03-20 16:17 編輯
初次接觸asio,照著例子寫(xiě)了一個(gè),鏈接的是echo_server
echo_server收到了發(fā)送的數(shù)據(jù),也返回了.
問(wèn)題1.io_service在resolver之前就run,為啥會(huì)提示boost::system 995錯(cuò)誤
問(wèn)題2.客戶端異步發(fā)送了,但是沒(méi)有異步讀取。如果改成同步讀取又能收到數(shù)據(jù)
幫忙看下是啥問(wèn)題。- 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);
- //問(wèn)題1.如果在這里調(diào)用run函數(shù),就會(huì)提示boost::system 995錯(cuò)誤
- // 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");
- //問(wèn)題2.異步讀沒(méi)有收到,如果改成boost::asio::read_some可以收到數(shù)據(jù)
- std::thread t([&io_service]() { io_service.run(); });
- t.join();
-
- //system("pause");
- return 0;
- }
復(fù)制代碼 |
|