Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
应用程序缓冲区中的recv()_C_Sockets_Unix - Fatal编程技术网

应用程序缓冲区中的recv()

应用程序缓冲区中的recv(),c,sockets,unix,C,Sockets,Unix,我有一个第三方库,它使用recv()并将套接字描述符作为参数,从网络套接字读取RTMP数据包。我希望它从应用程序缓冲区读取这些数据包(在堆中分配) 有可能吗?我不知道直接的方法,但您可以使用管道将数据发送到第三方堆栈。它将为您提供两个文件描述符,一个用于写入数据,另一个必须提供给能够读取数据的堆栈。我不知道直接的方法,但您可以使用管道将数据发送到第三方堆栈。它将为您提供两个文件描述符,一个用于写入数据,另一个必须提供给能够读取数据的堆栈。使用管道 #include <stdio.h

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


有可能吗?

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

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

使用管道

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

    main()
    {
            int     fd[2];

            pipe(fd);

    }
#包括
#包括
#包括
main()
{
int-fd[2];
管道(fd);
}
fd[0]是您传递给第三方的文件,fd[1]是您将数据包写入的文件。

是否使用管道

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

    main()
    {
            int     fd[2];

            pipe(fd);

    }
#包括
#包括
#包括
main()
{
int-fd[2];
管道(fd);
}

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

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

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

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

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

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


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

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

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

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

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


您可以使用,这将创建一对连接的(unix域)套接字。如果您使用的是Linux,则可以使用填充套接字,否则可以像往常一样使用
send()

您可以使用,这将创建一对连接的(unix域)套接字。如果您在Linux上,您可以像往常一样使用
send()
填充套接字。

让我看看我是否理解您的问题:您有一个库,它使用
recv()
接收数据,您想用从缓冲区读取的内容替换
recv()
。对吗?对。但是我只能操作文件描述符。让我看看我是否理解你的问题:你有一个库,它使用
recv()
来接收数据,你想用从缓冲区读取的东西来替换
recv()
。对吗?对。但是我只能操作文件描述符。管道呢,听起来比你建议的要简单。你看到使用管道的潜在问题了吗?管道呢,听起来比你建议的要简单。您是否看到使用管道时可能出现的问题?如果我将()数据发送到fd[1],或将库recv()数据从fd[0]发送到fd[1],结果是88:对非套接字执行套接字操作。如何克服这一点?嗯,目前还不能尝试。可能您需要使用如下HasturkunIf()所述的socketpair,将数据发送到fd[1],或库recv()从fd[0]接收数据,结果是88:非套接字上的套接字操作。如何克服这一点?嗯,目前还不能尝试。也许您需要使用下面HasturkunYes提到的socketpair,socketpair似乎可以无误地处理send()和recv()。是的,socketpair似乎可以无误地处理send()和recv()。