社区首页 >问答首页 >async_ read_until不像预期的那样工作

async_ read_until不像预期的那样工作
EN

Stack Overflow用户
提问于 2015-11-18 15:19:15
回答 1查看 223关注 0票数 1

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

代码语言:javascript
代码运行次数:0
复制
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();
}

类标题如下:

代码语言:javascript
代码运行次数:0
复制
class TcpServer {
 private:
  io_service svc;  
  tcp::socket socket{svc};

  double yawData = 0;
  unsigned short ipPort;
  bool connectMode = 0;
  streambuf input_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 );
  void Write_Data();
  void Read_Data();
  void UpdateYaw(double);
  ~TcpServer();
};

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

有什么想法可能是错误的,或者,任何调试提示吗?

谢谢

编辑

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

代码语言:javascript
代码运行次数:0
复制
  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++;

     }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-19 01:10:24

代码语言:javascript
代码运行次数:0
复制
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;
    }
}

此函数结束异步处理。它不会安排更多的异步工作,因此,正如所记录的那样,io_service::run()结束了。

您希望直接链接或使用io_service::work来保持服务运行。我建议用链子:

代码语言:javascript
代码运行次数:0
复制
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();
    }
}

但是..。

等一等

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

代码语言:javascript
代码运行次数:0
复制
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));
}

这里发生了什么事?首先创建一个临时流,不能使用它追加回车,然后将对本地字符串的引用传递给async_write.那是行不通的。我是未定义行为

解决办法:

代码语言:javascript
代码运行次数:0
复制
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));
}

演示

住在Coliru

代码语言:javascript
代码运行次数:0
复制
#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;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33792410

复制
相关文章
[php][零散代码]php日期计算
[php][零散代码]php日期计算 <?php $startData = "2020-01-1"; $stopData = "2020-01-31"; $s = new \DateTime(
landv
2020/04/25
2.6K0
PHP-包含文件
5、包含文件相当于把包含文件中的代码拷贝到主文件中执行,魔术常量除外,魔术常量获取的是所在文件的信息。
cwl_java
2020/03/26
1.3K0
php日期处理代码
<?php echo "<pre>"; echo date("Y-m-d",strtotime("now")), "\n"; echo "<pre>"; echo date("Y-m-d",strto
用户7108768
2021/09/22
5K0
PHP 日期相关函数
设置时区 date_default_timezone_get(); date_default_timezone_set('PRC'); 时间戳 time(); 得到指定时间的时间戳 mktime( [$hour, $min, $sec, $mon, $day, $year]); 将英文文本的日期或时间转换成时间戳 strtotime($time [, $now]); strtotime('+1 day'); 微秒 microtime( [$get_as_float]); microtime(true)
康怀帅
2018/02/28
1.9K0
php文件包含日志getshell
好久之前,看到过一篇文章,是利用文件包含漏洞,包含的日志文件进行的getshell,看到文章后就感觉,思路不错,不禁反思,为什么当时碰到文件包含的时候没有想着用这些方法来测试,今天就特地写一篇来记(水)录(文)一下,内容很少,看着就当图一乐
Elapse
2021/03/03
2K0
php文件包含日志getshell
文件包含、PHP伪协议
当使用include()函数包含文件时,只有代码执行到 include() 函数时才将文件包含进来,发生错误时只给出一个警告,继续向下执行。
字节脉搏实验室
2020/12/21
2.7K0
文件包含、PHP伪协议
【说站】php包含字符
strpos函数返回boolean值。strpos的执行速度比其他函数快。另外,strpos有参数指定的判断位置,但默认为空。意思是判断整个字符串。缺点是对中文的支持不好。
很酷的站长
2022/11/23
1.5K0
【说站】php包含字符
php获取农历日期节日
$c = new DayService(); $today=$c->convertSolarToLunar(date('Y'),date('m'),date('d')); $time ="农
IT工作者
2022/03/01
8K0
PHP 文件包含漏洞姿势总结
文件包含漏洞的产生原因是在通过 PHP 的函数引入文件时,由于传入的文件名没有经过合理的校验,从而操作了预想之外的文件,就可能导致意外的文件泄露甚至恶意的代码注入。
信安之路
2018/08/08
4.2K0
PHP 文件包含漏洞姿势总结
PHP 实现公历日期与农历日期的互转换
PHP 实现公历日期与农历日期的互转换 前言:  今天根据客户的需求对时间进行了转换,就是客户要求增加农历日期的显示,在网上抄袭了一段,稍微修改了一下运行成功了,不难的,改动的很少的.
用户2323866
2021/07/07
5.5K0
strftime 中文 python格式化日期包含中文 出错
想用python获取当前时期, 格式是2018年1月1日,结果出现上面错误, 处理方法
ClearSeve
2022/02/11
1.2K0
strftime 中文 python格式化日期包含中文 出错
PHP远程文件包含(RFI)并绕过远程URL包含限制
本文我们讲如何绕过远程URL包含限制。在PHP开发环境php.ini配置文里”allow_url_fopen、allow_url_include“均为“off”的情况下,不允许PHP加载远程HTTP或FTP的url进行远程文件包含时。我们依旧可以使用SMB,来加载执行远程文件。
Ms08067安全实验室
2021/04/07
2.8K0
PHP远程文件包含(RFI)并绕过远程URL包含限制
PHP- 日期和时间函数
date(): 获取当前日期和时间 date()函数用于获取当前日期和时间,返回值为一个格式化的日期字符串。
堕落飞鸟
2023/04/26
2K0
php案例:创建日期时间目录
贵哥的编程之路
2023/10/16
1840
php案例:创建日期时间目录
解决后台返回的Timestamp日期数据里包含T
在response entity 的timestamp字段的get方法上添加注解JsonFormat,如:   @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") public Timestamp getUpdateTime() { return updateTime; }
qubianzhong
2018/09/19
1.7K0
PowerQuery 如何获取起止日期内包含的月份?
今天在群里看到一个问题,如何获取起始日期和结束日期之间包含的所有月份,业务逻辑见下图:
披头
2020/05/13
2.3K0
有趣!你会检查单元格是否包含日期吗?
大家知道,Excel将日期存储为数字,只是显示的是日期格式,例如,Excel单元格中显示的是2022年5月10日,但实际上存储的是数字44691。
fanjy
2022/06/04
1.8K0
有趣!你会检查单元格是否包含日期吗?
PHP中的日期相关函数(三)
之前我们已经介绍过了 PHP 的一些相关的日期操作对象,今天我们就来学习剩下的那些面向过程的使用方式。当然,如果是和 DateTime 类中相似的方法我们就不再进行介绍了。另外,Date() 和 time() 这两个非常常用的函数也不会进行介绍,因为大家都已经用滥了,所以我们也就不浪费宝贵的学习资源了。
硬核项目经理
2021/03/16
1.9K0
点击加载更多

相似问题

这是有状态web服务/wcf服务吗?

23

这是托管WCF服务的正确方式吗?

30

如何向WCF服务库添加服务。这是正确的吗?

10

这是WCF服务应用程序的有效使用吗?

36

是否拒绝对Wcf服务的调用?这是web配置的问题吗?

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文