Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 异步读取直到不';I don’我没有按预期工作_String_Sockets_Boost_Tcp_Boost Asio - Fatal编程技术网

String 异步读取直到不';I don’我没有按预期工作

String 异步读取直到不';I don’我没有按预期工作,string,sockets,boost,tcp,boost-asio,String,Sockets,Boost,Tcp,Boost Asio,所以我试图编写一个程序,通过tcp套接字读写数据。我可以成功地接受连接,将数据写入其中(尽管写入处理程序不能按预期工作?)。我还想通过同一个套接字读取数据——这似乎不起作用。 处理所有这些的类如下所示: using namespace boost::asio; using namespace boost::asio::ip; TcpServer::TcpServer(unsigned short port = 1700) : ipPort(port){ tcp::acceptor a

所以我试图编写一个程序,通过tcp套接字读写数据。我可以成功地接受连接,将数据写入其中(尽管写入处理程序不能按预期工作?)。我还想通过同一个套接字读取数据——这似乎不起作用。 处理所有这些的类如下所示:

using namespace boost::asio;
using namespace boost::asio::ip;


TcpServer::TcpServer(unsigned short port = 1700)
  : ipPort(port){
  tcp::acceptor acc(svc, tcp::endpoint(tcp::v4(), ipPort));
  acc.listen();
  acc.async_accept(socket, boost::bind(&TcpServer::Accept_Handler,this, placeholders::error));

  SAY("Waiting for a New connection");
  svc.run();
}

void TcpServer::Write_Handler(const boost::system::error_code& ec,
                  std::size_t bytes_transferred){
  std::cout << ec.message() << std::endl;
  if (!ec)
    {
      std::cout << "Just sent " << yawData << std::endl;
    }
}
void TcpServer::Read_Handler(const boost::system::error_code& ec,
                std::size_t bytes_transferred){
  if (!ec)
    {
      std::string line;
     std::istream is(&input_buffer_);
     std::string test;
     is >> test;
     std::cout << "test" << test << std::endl;
     std::getline(is, line);
     if (!line.empty())
       {
     std::cout << "Recieved: " << line << std::endl;
       }
    }
  else
    std::cout << "Error reading:" << ec.message() << std::endl;
}

void TcpServer::Accept_Handler(const boost::system::error_code& ec){
  if (!ec)
    {
      std::cout << "Accepted a connection! - Now switching to write mode " << std::endl;
  connectMode = 1;
    }
}

void TcpServer::Write_Data(){
  if (connectMode){
    SAY("Sent data");
    std::ostringstream ss;
    std::string sendBuffer;
    ss << std::fixed << std::setprecision(2);
    ss << yawData;
    sendBuffer = ss.str() + "\r";
    async_write(socket, buffer(sendBuffer),       boost::bind(&TcpServer::Write_Handler, this,
                      placeholders::error,
                       placeholders::bytes_transferred));
    }
}


void TcpServer::UpdateYaw(double data) {
  yawData = data;
}  

void TcpServer::Read_Data(){
  if (connectMode){
    async_read_until(socket, input_buffer_, "\n" ,      boost::bind(&TcpServer::Read_Handler, this,
                          placeholders::error,
                               placeholders::bytes_transferred));
  }
}

TcpServer::~TcpServer(){
   svc.stop();
}
  TcpServer *socketObj = new TcpServer(1700);

     while ( i < 100 && trackObj->ReadTrackingState() != 0) {
      SAY("Current Yaw - %.02f", trackObj->CurrentYaw());
      socketObj->UpdateYaw(trackObj->CurrentYaw());
      socketObj->Write_Data();
      socketObj->Read_Data();
      Platform::sleepMillis(1000);
      i++;

     }
要使用它,我调用Write_Data(),后跟Read_Data()。Write_数据可以工作,但是没有调用Write处理程序-我可以在客户端接收数据。 Read_Data()根本不起作用。我确信数据是通过套接字以所需的格式发送的(以“\n”结尾)

关于可能出现的错误或调试提示,有什么想法吗

谢谢

编辑

我计划从我的主函数运行write_data和read_data函数,如下所示:

using namespace boost::asio;
using namespace boost::asio::ip;


TcpServer::TcpServer(unsigned short port = 1700)
  : ipPort(port){
  tcp::acceptor acc(svc, tcp::endpoint(tcp::v4(), ipPort));
  acc.listen();
  acc.async_accept(socket, boost::bind(&TcpServer::Accept_Handler,this, placeholders::error));

  SAY("Waiting for a New connection");
  svc.run();
}

void TcpServer::Write_Handler(const boost::system::error_code& ec,
                  std::size_t bytes_transferred){
  std::cout << ec.message() << std::endl;
  if (!ec)
    {
      std::cout << "Just sent " << yawData << std::endl;
    }
}
void TcpServer::Read_Handler(const boost::system::error_code& ec,
                std::size_t bytes_transferred){
  if (!ec)
    {
      std::string line;
     std::istream is(&input_buffer_);
     std::string test;
     is >> test;
     std::cout << "test" << test << std::endl;
     std::getline(is, line);
     if (!line.empty())
       {
     std::cout << "Recieved: " << line << std::endl;
       }
    }
  else
    std::cout << "Error reading:" << ec.message() << std::endl;
}

void TcpServer::Accept_Handler(const boost::system::error_code& ec){
  if (!ec)
    {
      std::cout << "Accepted a connection! - Now switching to write mode " << std::endl;
  connectMode = 1;
    }
}

void TcpServer::Write_Data(){
  if (connectMode){
    SAY("Sent data");
    std::ostringstream ss;
    std::string sendBuffer;
    ss << std::fixed << std::setprecision(2);
    ss << yawData;
    sendBuffer = ss.str() + "\r";
    async_write(socket, buffer(sendBuffer),       boost::bind(&TcpServer::Write_Handler, this,
                      placeholders::error,
                       placeholders::bytes_transferred));
    }
}


void TcpServer::UpdateYaw(double data) {
  yawData = data;
}  

void TcpServer::Read_Data(){
  if (connectMode){
    async_read_until(socket, input_buffer_, "\n" ,      boost::bind(&TcpServer::Read_Handler, this,
                          placeholders::error,
                               placeholders::bytes_transferred));
  }
}

TcpServer::~TcpServer(){
   svc.stop();
}
  TcpServer *socketObj = new TcpServer(1700);

     while ( i < 100 && trackObj->ReadTrackingState() != 0) {
      SAY("Current Yaw - %.02f", trackObj->CurrentYaw());
      socketObj->UpdateYaw(trackObj->CurrentYaw());
      socketObj->Write_Data();
      socketObj->Read_Data();
      Platform::sleepMillis(1000);
      i++;

     }
TcpServer*socketObj=新的TcpServer(1700);
而(i<100&&trackObj->ReadTrackingState()!=0){
说(“当前偏航-%.02f”,轨迹对象->当前偏航());
socketObj->UpdateYaw(trackObj->CurrentYaw());
socketObj->Write_Data();
socketObj->Read_Data();
平台:sleepMillis(1000);
i++;
}
但是

等等 您需要仔细检查所有代码

void TcpServer::Write_Data() {
    SAY("Sent data");
    std::ostringstream ss;
    std::string sendBuffer;
    ss << std::fixed << std::setprecision(2);
    ss << yawData;
    sendBuffer = ss.str() + "\r";
    async_write(socket, buffer(sendBuffer),
            boost::bind(&TcpServer::Write_Handler, this, placeholders::error, placeholders::bytes_transferred));
}
演示

#包括
#包括
#包括
#包括
使用名称空间boost::asio;
使用名称空间boost::asio::ip;
模板

静态内联void SAY(T&&v){std::cout非常感谢!这是非常精彩和详细的。我没有链接它们的原因是,我调用了Write_Data()和Read_Data()在另一个文件中的主函数循环中,就像您解释的那样,因为服务不再存在了,这是行不通的。有没有办法我可以这样做?我编辑了这个问题来添加我打算如何运行通信。我在文档上有点丢失。使用<代码> IoService::工作<代码>或考虑Co代码>产卵< /代码>。惯例
void TcpServer::Write_Data() {
    SAY("Sent data");
    std::ostringstream ss;
    std::string sendBuffer;
    ss << std::fixed << std::setprecision(2);
    ss << yawData;
    sendBuffer = ss.str() + "\r";
    async_write(socket, buffer(sendBuffer),
            boost::bind(&TcpServer::Write_Handler, this, placeholders::error, placeholders::bytes_transferred));
}
void TcpServer::Write_Data() {
    SAY("Send data");
    std::ostream ss(&output_buffer_);
    ss << std::fixed << std::setprecision(2) << yawData << "\r";
    async_write(socket, output_buffer_,
            boost::bind(&TcpServer::Write_Handler, this, placeholders::error, placeholders::bytes_transferred));
}
#include <boost/asio.hpp>
#include <boost/bind.hpp>
#include <iostream>
#include <iomanip>

using namespace boost::asio;
using namespace boost::asio::ip;

template <typename T>
static inline void SAY(T&& v) { std::cout << std::forward<T>(v) << "\n"; }

class TcpServer {
  private:
    io_service svc;
    tcp::socket socket{ svc };

    double yawData = 0;
    unsigned short ipPort;
    streambuf input_buffer_, output_buffer_;

    void Write_Handler(const boost::system::error_code &, std::size_t);
    void Read_Handler(const boost::system::error_code &, std::size_t);
    void Accept_Handler(const boost::system::error_code &);

  public:
    TcpServer(unsigned short = 1700);
    void Write_Data();
    void Read_Data();
    void UpdateYaw(double);
    ~TcpServer();
};

TcpServer::TcpServer(unsigned short port) : ipPort(port) {
    tcp::acceptor acc(svc, tcp::endpoint(tcp::v4(), ipPort));
    acc.listen();
    acc.async_accept(socket, boost::bind(&TcpServer::Accept_Handler, this, placeholders::error));

    SAY("Waiting for a New connection");
    svc.run();
}

void TcpServer::Write_Handler(const boost::system::error_code &ec, std::size_t /*bytes_transferred*/) {
    std::cout << ec.message() << std::endl;
    if (!ec) {
        std::cout << "Just sent " << yawData << std::endl;
        Read_Data();
    }
}
void TcpServer::Read_Handler(const boost::system::error_code &ec, std::size_t /*bytes_transferred*/) {
    if (!ec) {
        std::cout << "Recieved: " << &input_buffer_ << std::endl;
    } else
        std::cout << "Error reading:" << ec.message() << std::endl;
}

void TcpServer::Accept_Handler(const boost::system::error_code &ec) {
    if (!ec) {
        std::cout << "Accepted a connection! - Now switching to write mode " << std::endl;
        Write_Data();
    }
}

void TcpServer::Write_Data() {
    SAY("Send data");
    std::ostream ss(&output_buffer_);
    ss << std::fixed << std::setprecision(2) << yawData << "\r";
    async_write(socket, output_buffer_,
            boost::bind(&TcpServer::Write_Handler, this, placeholders::error, placeholders::bytes_transferred));
}

void TcpServer::UpdateYaw(double data) { yawData = data; }

void TcpServer::Read_Data() {
    async_read_until(socket, input_buffer_, "\n", boost::bind(&TcpServer::Read_Handler, this, placeholders::error,
                placeholders::bytes_transferred));
}

TcpServer::~TcpServer() { svc.stop(); }

int main() {
    TcpServer server;
}