使用 Boost ASIO 处理没有套接字的 TCP
Using Boost ASIO to process TCP without sockets
在遵循有关创建组合TCP/UDP异步服务器的教程之后,我正在进一步研究应用Boost ASIO直接从字节流解析数据。
我的目标是提供一些独立于套接字的机制。在我的场景中,我正在处理来自 Java 实现的文件描述符。在 Java 中,我可以使用以下命令读取文件描述符:
is = new FileInputStream(fd);
os = new FileOutputStream(fd);
是否可以用某种输入和输出字节流替换套接字,并让 ASIO 负责处理 TCP 连接?
我想到的是使用socket.h中的connect
;类似于:
connect((int) fd, (struct sockaddr *) &peerAddr, sizeof(peerAddr))
这当然会建立连接,并期望对等sockaddr_in
连接到。我希望可能有某种类似的方法将boost::asio::ip::tcp::socket
绑定到文件描述符。这种性质的事情可能吗?
将评论移至答案,是的,boost asio 有这样的功能,它被称为 Socket IOStreams,请参阅此处:http://www.boost.org/doc/libs/1_47_0/doc/html/boost_asio/overview/networking/iostreams.html
尽管 Boost Asio 文档包含您要查找的内容,但如果您还不知道它在那里,则很难找到(甚至破译)。
假设您有一个来自 connect(2)
或 accept(2)
的 IPv4 TCP 套接字文件描述符fd
,您可以使用以下内容在其周围包装一个 Boost iostream
:
boost::asio::ip::tcp::iostream stream;
stream.rdbuf()->assign(boost::asio::ip::tcp::v4(), dup(fd));
请注意重复的文件描述符,它会阻止 Boost 在流超出范围时从您下方关闭本机套接字连接。
您可能还需要调整后备缓冲区以满足您的需求:
char buf[1024]; // or whatever
stream.rdbuf()->pubsetbuf(buf, sizeof(buf));
相关文章:
- 通过套接字[TCP]传输数据 如何在C / C ++中打包多个整数并使用send() recv()传输数据
- 我可以与 python 服务器而不是 c++ 客户端建立 tcp/ip 套接字吗?
- C++ TCP 套接字通信 - 连接按预期工作,几秒钟后失败,没有收到新数据,read() 和 recv() 块
- TCP 服务器的异步读取使用 boost::asio 打印客户端套接字发送的数据
- C++ TCP 套接字 | 无法将"std::__cxx11::字符串"转换为"const
- ASIO 的 TCP 套接字::async_wait() 并在此之后关闭套接字
- Visual Studio(C++):如何使用TCP套接字发送多个值
- TCP套接字(客户端-服务器)recv()返回-1值
- 如何从 boost::asio::ssl::stream<boost::asio::ip::tcp::socket> 获取本机套接字文件描述器?
- C++中TCP套接字的recv函数
- 通过 TCP 套接字发送大型 base64 字符串
- 提升 ASIO TCP 套接字 1.70 不向后兼容
- 尝试连接到 TCP 套接字 (Linux) 时连接被拒绝
- 仅通过建立一次TCP连接将Recv从客户端发送到服务器套接字
- 如何知道请求是否完全使用 TCP 套接字接收?
- Qt TCP 套接字 - 写入超过 15 个字节
- 要打开以供C++中的应用程序最佳使用的并行套接字/TCP连接数
- C++ 如何通过套接字 (TCP) 进行二进制序列化
- 套接字 TCP 服务器程序问题
- Cpp套接字-TCP传输(使用同一端口发送,然后接收)