来自应用程序缓冲区的recv()

时间:2011-03-16 07:51:26

标签: c sockets unix

我有一个第三方库,它使用recv()并将套接字描述符作为参数从网络套接字读取RTMP数据包。我希望它从应用程序缓冲区中读取这些数据包(在堆中分配)。

有可能吗?

4 个答案:

答案 0 :(得分:2)

您可以使用socketpair,它会创建一对连接(unix域)套接字。如果您使用的是Linux,则可以使用vmsplice填充套接字,否则照常使用send()

答案 1 :(得分:1)

我不知道这样做的直接方法,但您可以使用pipe将数据发送给第三方堆栈。它将为您提供两个文件描述符,一个用于编写数据,另一个必须提供给能够读取数据的堆栈。

答案 2 :(得分:1)

使用烟斗?

    #include <stdio.h>
    #include <unistd.h>
    #include <sys/types.h>

    main()
    {
            int     fd[2];

            pipe(fd);

    }

fd [0]是您传递给第三方的,fd [1]是您将数据包写入的。

答案 3 :(得分:0)

除非您的第三方库已经支持从缓冲区而不是网络读取,否则这并不容易:

  • 如果您可以访问源代码第三方库并允许修改它,那么正确的解决方案可能是修改其源代码以允许从缓冲区读取。

  • 您可以通过本地代理服务器重播网络数据包,并让第三方库使用它。然而,这并不是生产应用的完全解决方案 - 只能用于测试或胁迫。

  • 根据您对网络的使用情况,您可以使用预加载的库override recv()库函数。当然,这取决于使用recv()的C库存根的第三方库,而不是直接系统调用。

  • 如果您想了解更多可疑的技术,并且您获得te第三方库的许可(不太可能是商业产品),您可以修改共享对象用另一个具有相同接口但从堆缓冲区接收数据的函数替换recv()的库。