使用 Boost ASIO 处理没有套接字的 TCP

Using Boost ASIO to process TCP without sockets

本文关键字:套接字 TCP Boost ASIO 处理 使用      更新时间:2023-10-16

在遵循有关创建组合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));