使用Boost :: ASIO连续流数据而无需关闭套接字

gan*_*oji 1 c++ sockets boost tcp

我正在尝试构建一个应用程序:

a)内部运行FDM(飞行动力学模型),并管理飞行数据

b)接受TCP套接字上的连接

c)在所述插座上提供飞行数据。

目前,我已经使用Boos :: ASIO网站上的示例/教程,通过本地套接字通过TCP发送了一个简单的字符串:http : //www.boost.org/doc/libs/1_56_0_b1/doc/ html / boost_asio / tutorial.html

我的麻烦很简单,就是在写入单个字符串后关闭连接,而且我不知道如何保持连接打开并持续发送数据,直到模拟完成(或从监听应用程序发送停止信号)为止。

我还让FDM工作(当前使用JSBSim,并从其随附的示例代码中大量借用了),并且可以将飞行数据打印到stdout没问题。Boost:ASIO文档显示了一些有关如何构建服务器的示例,该服务器不断侦听从客户端收到的消息,但是没有一个服务器发送数据流。

seh*_*ehe 5

要发送数据流,可以将free函数与一起使用boost::asio::streambuf

这是一个简单的演示,它将自己的源发送给每个客户端:

#include <boost/asio.hpp>
#include <boost/make_shared.hpp>
#include <boost/function.hpp>
#include <boost/asio/posix/stream_descriptor.hpp>
#include <fstream>
#include <iostream>

namespace io = boost::asio;
namespace ip = io::ip;
using boost::system::error_code;
using boost::make_shared;
using ip::tcp;

void start_accept(io::io_service& svc, tcp::acceptor& acc) {
    // per-connection lifetimes:
    auto sock = make_shared<tcp::socket>(svc);

    acc.async_accept(*sock, [sock,&svc,&acc](error_code ec) {
        if (!ec)
        {
            std::cout << "connection from " << sock->remote_endpoint() << "\n";

            // copy source file to buffer data
            auto data = make_shared<io::streambuf>();
            std::ostream(data.get()) << std::ifstream("main.cpp").rdbuf();

            // now write the whole story
            io::async_write(*sock, *data, [sock,data/*keep alive*/](error_code ec, size_t transferred){});

            // accept new connections too
            start_accept(svc, acc);
        }
    });
}

int main()
{
    io::io_service svc;
    tcp::acceptor acc(svc, tcp::endpoint(ip::address(), 6767));

    start_accept(svc, acc);

    svc.run();
}
Run Code Online (Sandbox Code Playgroud)

请注意,为简单起见,假设您可以做到这一点,我首先将完整缓冲区放入内存中(您说过“并且可以将飞行数据打印到stdout没问题”)。因此,您可以向流中写入不同的内容(ostream示例中的行)。