Как перенаправить stdout (stderr) дочернего процесса в сокет в winapi? - PullRequest
2 голосов
/ 18 марта 2011

Я хочу создать клиент-серверную программу, где сервер является основным процессом, а клиент - дочерним процессом.В клиенте я хочу перенаправить потоки дочерних процессов stdout и stderr в сокет.На сервере я хочу сделать из сокета файловый дескриптор и прочитать из него.В интернете много информации о сокетах, но я не нашел ни одного примера родительского-дочернего IPC через сокеты для окон.

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

PS Пожалуйста, не предлагайте каналыЯ хочу сделать это через сокеты.

Ответы [ 4 ]

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

Посмотрите на Netcat , если вы можете использовать это или найти источник версии для Windows где-нибудь на sourceforge, возможно, он может использовать каналы для перехвата stdin / stdout и отправки и чтения из сокетов с этими каналами.

Я знаю, что вы сказали, что нет каналов, но другого способа сделать это можно только с помощью Windows API.Как минимум, вам понадобится следующее:

CreatePipe

WriteFile

ReadFile

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

Единственное окружение, которое я знаю, поддерживает это Cygwin.Они с открытым исходным кодом - попробуйте просмотреть их код для идей.Тем не менее, это гарантированно будет очень неприятно, с такими вещами, как прокачка ниток вокруг.

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

Предполагается:

server talks with client

и

client spawns child

Вот пример из MSDN для создания дочернего процесса с перенаправленным вводом-выводом

К сожалению, вы ДОЛЖНЫ использовать каналы для передачи ввода-вывода от дочерней программы к клиенту.Нет, если, и то, или другое об этом.

Затем вы можете использовать что-то вроде следующего для получения информации на сервер:

цикл связи клиента:

while ( /* files are open */ ) { 
    DWORD dwRead;  
    CHAR chBuf[1024]; memset(chBuf, 0, 1024); /* always initialize your memory! */
    BOOL bSuccess = FALSE;

    /* read data from child pipe */
    ReadFromFile(g_hSChildStd_IN_Rd, chBuf, 1024, &dwRead, NULL );      

    /* send data via windows sockets to the remote server connection 
       represented by serverSocketHandle */
    send(serverSocketHandle, chBuf, dwRead, 0);
}

Ваш клиент, по сути, становится переводчиком междутруба STDOUT / ERR и сокет TCP.

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

Это все равно что пытаться потушить пожар после его начала, когда вы должны пытаться предотвратить пожар в первую очередь.

Поскольку вы являетесь провозглашенным автором и server.exe, и client.exe, вместо того, чтобы пытаться перехватить stdout / stderr и перенаправить его в сокет в этот момент, вам следует перестроить клиент так, чтобы вы перехватывает текст, предназначенный для стандартного вывода, ДО того, как он перейдет на стандартный вывод.

В этот момент вы можете отправить выходной текст ОБА и стандартный сокет, если хотите.

РЕДАКТИРОВАТЬ: игнорировать верхнюю половину, поскольку вы позже сказали, что вы НЕ автор клиента.

Хорошо, вторая попытка:

Поскольку вы порождаете «настоящего» клиента, используя «поддельный» клиент, почему бы вам просто не перехватить стандартный вывод «реального» клиента на стандартный ввод «поддельного» клиента (открыть канал). Затем «поддельный» клиент отправляет данные обратно в сокет.

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