使用Boost :: ASIO连续传输数据而不关闭套接字

时间:2014-10-31 21:14:10

标签: 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文档显示了一些关于如何构建服务器的示例,该服务器不断监听从客户端接收的消息,但没有一个发送数据流。

1 个答案:

答案 0 :(得分:4)

要发送数据流,您可以使用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();
}

请注意,为了简单起见,我首先将完整缓冲区放在内存中,假设您可以这样做(您说&#34;并且可以打印飞行数据到stdout没问题&#34; )。所以,你可以在流中写出不同的东西(在我的例子中是ostream行)。