Как перенаправить вывод fprintf на C-сокет? - PullRequest
4 голосов
/ 08 января 2012

Как перенаправить вывод fprintf в сокет?

Я редактирую исходный код, который содержит fprintf звонков. Это входит в файл. Но я бы хотел перенаправить этот журнал в сокет.

Как это можно сделать?

Ответы [ 3 ]

5 голосов
/ 08 января 2012

В Unix-подобных системах откройте сокет (получая дескриптор файла).

Сопоставьте сокет с stderr

Если вы еще не использовали stderr, вы можетепросто используйте dup2(), чтобы сделать сокет выходным каналом.Вы можете сделать это, даже если вы отправили некоторые данные на исходный stderr.Предложение в комментарии об использовании fflush() может быть уместным, хотя stderr обычно небуферизуется, а не полностью буферизируется (поэтому обычно нет ничего для сброса).

Можно использовать функцию freopen()изменить вывод потока, например stderr (в частности).Хммм, не могли бы вы использовать freopen() для сопоставления stderr с /dev/fd/N, где N - дескриптор файла сокета?Да, вы, вероятно, могли бы.

Сопоставить сокет с другим потоком

Перечитать ваш вопрос - я не вижу в нем stderr.Таким образом, функция fdopen() создает поток из файлового дескриптора.Так что, если вы можете указать поток для записи в журнал, вы дома.Если вы не можете указать это, но можете видеть это, то уловка freopen(), описанная выше, должна работать и здесь.

3 голосов
/ 08 января 2012

Не существует такой вещи, как «сокет C», но вы, вероятно, имеете в виду одну из двух вещей (WinSock или libsocket).В любом случае, основным методом, который я бы использовал, было бы использовать #define и простую функцию, подобную этой:

#define fprintf(a,b,...) fprintfsock(a,b,__VA_ARGS__)

void fprintfsock( SOCKET s, const char* f, ... )
{
    va_list a;
    va_start( a, f );
    int l = vsnprintf( 0, 0, f, a );
    char* buf = (char*) malloc( l + 1 );
    va_start( a, f );
    vsnprintf( buf, l, f, a );
    send( s, buf, l, 0 );
    free( buf );
}

, которая будет работать в любом из них, кроме как с libsocket, вы должны ввести typedef или использоватьINT для розетки.Убедитесь, что вы #undef fprintf после того, как закончите вход в сокет!

2 голосов
/ 08 января 2012

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

Вы можете сделать что-то вродеэто (обновлено для использования журнала fifo):

mkfifo /path/to/log

nc <ip> <port> < /path/to/log

http://netcat.sourceforge.net/

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