recv () из буфера приложения - PullRequest
1 голос
/ 16 марта 2011

У меня есть сторонняя библиотека, которая читает пакеты RTMP из сетевого сокета, используя recv () и принимая дескриптор сокета в качестве аргумента. Я хочу, чтобы он вместо этого считывал эти пакеты из буфера приложения (выделенного в куче).

Возможно ли это?

Ответы [ 4 ]

2 голосов
/ 16 марта 2011

Вы можете использовать socketpair, который создает пару соединенных (домен unix) сокетов.Если вы работаете в Linux, вы можете заполнить сокет, используя vmsplice, в противном случае send() как обычно.

1 голос
/ 16 марта 2011

Использовать канал?

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

    main()
    {
            int     fd[2];

            pipe(fd);

    }

fd [0] - это тот, который вы передаете третьей стороне, fd [1] вы записываете пакеты.

1 голос
/ 16 марта 2011

Я не знаю прямого способа сделать это, но вы можете использовать pipe для отправки себе данных в стек сторонних производителей. Он предоставит вам два файловых дескриптора, один из которых вы будете записывать свои данные, а другой должен быть предоставлен в стек, который сможет читать ваши данные.

0 голосов
/ 16 марта 2011

Если ваша сторонняя библиотека уже не поддерживает чтение из буферов вместо сети, это будет непросто:

  • Если у вас есть доступ к сторонней библиотеке с исходным кодом иразрешено изменять его, правильное решение, вероятно, будет изменить его исходный код, чтобы разрешить чтение из буферов.

  • Вы можете быть в состоянии воспроизвести сетевые пакеты через локальный прокси-сервер ииспользовать стороннюю библиотеку.Однако это не совсем решение для производственных приложений - только то, что нужно сделать для тестирования или под принуждением.

  • В зависимости от того, как вы используете сеть, вы можете переопределить библиотечная функция recv() с предустановленной библиотекой.Конечно, это зависит от сторонней библиотеки, использующей заглушку библиотеки C для recv(), а не от системного вызова напрямую.

  • Если вы настроены на большее сомнительные методы , и вы разрешены лицензией сторонней библиотеки (маловероятно для коммерческих продуктов), вы можете изменить общий объект библиотеки, чтобы заменить recv() другой вашей собственной функцией, которая имеет такую ​​жеинтерфейс, но вместо этого получает данные из буфера кучи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...