簡體   English   中英

Boost asio,async_read和acync_write不調用回調

[英]Boost asio, async_read and acync_write not calling callbacks

我正在封裝boost-asio套接字,但是我遇到了問題,但是async_readasync_write都沒有調用它們的回調函數,我也不明白為什么。

我試過使用async_read_some但是有同樣的問題。

這是我到目前為止編寫的代碼

#include <iostream>
#include "socket.hpp"

Socket::Socket()
{
  boost::asio::ip::tcp::endpoint    ep_tmp(boost::asio::ip::tcp::v4(), 4242);

  endpoint = ep_tmp;
  acceptor = new boost::asio::ip::tcp::acceptor(ios, endpoint);
  tcp_socket = new boost::asio::ip::tcp::socket(ios);
  acceptor->listen();
}

Socket::~Socket()
{
  delete(acceptor);
  delete(tcp_socket);
}

void        Socket::get_connection()
{
  acceptor->async_accept(*tcp_socket, [](const boost::system::error_code &ec)
             {
               std::cout << "Connection received." << std::endl;
               if (ec)
                 std::cout << "Error " << ec << std::endl;
             });
  this->exec();
}

void        Socket::send(std::string &message)
{
  async_write(*tcp_socket, boost::asio::buffer(message),
          [](const boost::system::error_code &ec,
         std::size_t bytes_transferred)
          {
        std::cout << "Sending datas." << std::endl;
        if (ec)
          std::cout << "Error " << ec << std::endl;
        else
          std::cout << bytes_transferred << " bytes transferred." << std::endl;
          });
}

void        Socket::receive(void)
{
  char      *buf;

  buf = (char *)malloc(sizeof(char) * 50);
  buf = (char *)memset(buf, 0, 50);
  async_read(*tcp_socket, boost::asio::buffer(buf, 50),
         [](const boost::system::error_code &ec,
        std::size_t bytes_transferred)
         {
           std::cout << "Receiving datas." << std::endl;
           if (ec)
         std::cout << "Error " << ec << std::endl;
           else
         std::cout << bytes_transferred
               << " bytes transferred." << std::endl;
         });
}

void        Socket::exec(void)
{
  ios.run();
}

int     main()
{
  Socket    serv;
  std::string   data_test;

  data_test = "Test\n";
  serv.get_connection();
  serv.send(data_test);
  serv.exec();
  serv.receive();
  serv.exec();
  return (0);
}

在我找到不使用C的方法之前, malloc位是臨時的。

如果有人可以啟發我,我將非常感謝

您必須先調用io_service::reset ,然后再調用io_service::run 您可能想改用同步API,因為您當前的方法絕對違背了異步性的目的。

我和yuri在一起:除非您知道自己在做什么,否則請選擇非異步。

它可能看起來像這樣: http : //coliru.stacked-crooked.com/a/523a7828a9aee4b2

#include <boost/asio.hpp>
#include <iostream>

namespace ba = boost::asio;
using ba::ip::tcp;

class Socket {
  public:
    Socket() { acceptor.listen(); }

    void get_connection();
    void exec();
    void send(std::string const &message);
    void receive(void);

  private:
    ba::io_service ios;
    tcp::endpoint endpoint{ tcp::v4(), 4242 };
    tcp::acceptor acceptor{ ios, endpoint };
    tcp::socket tcp_socket{ ios };
};

void Socket::get_connection() {
    acceptor.accept(tcp_socket);
    std::cout << "Connection received.\n";
}

void Socket::send(std::string const &message) {
    std::cout << "Sending datas.\n";
    auto bytes_transferred = ba::write(tcp_socket, ba::buffer(message));
    std::cout << bytes_transferred << " bytes transferred.\n";
}

void Socket::receive(void) {
    std::cout << "Receiving datas.\n";

    char buf[50] = { 0 };
    auto bytes_transferred = ba::read(tcp_socket, ba::buffer(buf));
    std::cout << bytes_transferred << " bytes transferred.\n";
}

int main() {
    Socket serv;

    serv.get_connection();
    serv.send("Test\n");
    serv.receive();
}

如果要異步行為,則必須管理每個特定於緩沖區/連接的資源的生存期。 有很多示例,例如在文檔中或此處: http : //coliru.stacked-crooked.com/a/95e2000e49b4db1d

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM