【问题标题】:C++ boost asio tcp socket reading old dataC++ boost asio tcp socket读取旧数据
【发布时间】:2011-08-09 11:47:38
【问题描述】:

我是 Boost asio 新人。我正在运行一个 tcp 服务器客户端配对程序,但是当我运行一个新客户端时,该客户端也会接收所有旧写入。我正在用 async_read / async_write 读/写。所以服务器和客户端可能已经运行了一段时间,来回发送了 100~ 个数据包。当我打开第二个客户端并在其上接收时,我收到了所有 100 个旧的服务器发送的数据包! ip_address 使用“localhost”。

有什么方法可以清除缓冲区吗?除了关闭旧套接字并创建一个新套接字之外,也许还有其他方法?

读/写调用(未按此顺序使用,只是从我使用它们的位置复制了两个调用):

boost::array<char, 1024> buf;
boost::array<char, 1024> rbuf;
boost::asio::async_write(socket_, 
    boost::asio::buffer(buf.c_array(), 
    buf.size()),strand_.wrap(boost::bind(&async_tcp_client::handle_send_msg,
    this,boost::asio::placeholders::error)));

boost::asio::async_read(socket_, boost::asio::buffer(rbuf.c_array(), rbuf.size()),
    strand_.wrap(boost::bind(&async_tcp_client::handle_read,
    this, boost::asio::placeholders::error,
    boost::asio::placeholders::bytes_transferred)));

【问题讨论】:

  • 你说的没有道理。 TCP/IP 是基于连接的协议,因此在一个连接上发送的数据不应出现在另一个连接上。服务器是否有可能将数据复制到所有客户端?客户是否有不同的流程?

标签: c++ tcp boost-asio


【解决方案1】:

我不清楚你的缓冲区是如何作用域的。每个连接都需要一个缓冲区,一个用于读取和写入。只要异步操作处于活动状态,您还需要确保它们保持在范围内。

【讨论】:

    猜你喜欢
    • 2015-01-13
    • 2017-04-27
    • 2018-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-03
    • 2020-02-15
    • 1970-01-01
    相关资源
    最近更新 更多