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文档显示了一些有关如何构建服务器的示例,该服务器不断侦听从客户端收到的消息,但是没有一个服务器发送数据流。
要发送数据流,可以将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示例中的行)。
| 归档时间: |
|
| 查看次数: |
3299 次 |
| 最近记录: |