如何用套接字模拟tun接口通信c++?

How emulate tun interface communication c++ with socket?

我已经为 IOS 平台构建并实现了 OpenVpn 源代码。 这些来源没有 ios 支持,因为 Apple 不允许我们在 iPhone 上创建 tun 接口,但为我们提供了一些 API (PacketTunnelProvider)。现在我有了可以正常工作的 PacketTunnelProvider Extension。但我需要将数据包传输到 OpenVpn 客户端库,反之亦然。它可以通过必须传递给 ovpn cli 的单个文件描述符进行通信来完成。

在 openvpn 库的普通实现中,这个文件描述符是 tun 接口的文件描述符,但在这种情况下我们无法访问它(感谢 Apple)。因此,我们需要 "emulate" tun 接口在通过文件描述符进行通信方面的功能。

OpenVpn 库使用 boost::asio::posix::stream_descriptor 与 "write_some()" 和 "async_read_some()" 方法来读取和写入数据包到 "tun file descriptor"。 我正在尝试创建一个 unix 域数据报套接字,但是当我或 ovpn 尝试写入一些字节时,它会抛出错误 -> "Destination address required"。 我哪里错了?

    struct sockaddr_un addr;
    ScopedFD fd(socket(AF_UNIX, SOCK_DGRAM, 0));

    if (fd.defined()) {
        memset(&addr, 0, sizeof(addr));
        addr.sun_family = AF_UNIX;
        strcpy(addr.sun_path, socket_path);
        unlink(socket_path);

        if (bind(fd(), (struct sockaddr *)&addr, sizeof(addr)) < 0) {
            perror("bind");
        }else{

            boost::asio::io_service io_service;
            stream = new boost::asio::posix::stream_descriptor(io_service, fd());
            io_service.run();

        }
    }

好的,我解决了! 问题出在套接字实现中。 https://www.ibm.com/support/knowledgecenter/en/SSB23S_1.1.0.13/gtpc1/unixsock.html