Связь клиент-серверных приложений через командную строку с потоками c++

У меня есть два приложения, одно клиентское, другое серверное. Сервер запускает клиента как подпоток. Затем клиент выводит свои команды через стандартный выход. Сервер ожидает команду и отвечает соответствующим образом.

В основном клиент-сервер через стандартный выход.

Например:

client >> Move north
Server >> Your new location is {2,3} 
client >> Move north
Server >> Your new location is {2,2} 
client >> Shoot east 
Server >> Projectile 66638 heading east {3,2}

Проблема в том, что я не знаю, как соединить два приложения вместе, чтобы сервер читал и отвечал клиентскому приложению.

Причина, по которой я хотел бы использовать командную строку в качестве коммуникационного уровня, заключается в том, что я хочу максимально упростить создание клиента.

Также одновременно может быть более одного клиента. Клиенты должны иметь возможность взаимодействовать с сервером независимо друг от друга. (они не должны видеть сообщения друг друга)

В настоящее время я запускаю приложение через СоздатьПроцесс(). Эта функция упрощает настройку начальных параметров командной строки приложения. только не общение потом.

Мой вопрос:

  • Как серверное приложение, запускающее клиентское приложение в виде потока, читает/записывает стандартный вывод клиента?

person Steven Smethurst    schedule 05.11.2012    source источник
comment
Первое, что вам нужно сделать, это найти как сделать канал в c++   -  person Kiril    schedule 05.11.2012
comment
Попытка перенаправить stdout — долгий и мучительный способ использования именованного канала. Если вы уже используете CreateProcess(), используйте эту статью SDK для руководства: msdn.microsoft.com/en-us/library/windows/desktop/   -  person Hans Passant    schedule 05.11.2012
comment
Вы не можете использовать stdout/stdin как способ общения при использовании потоков. Если вы поместите клиента в отдельный процесс, это сработает, но я бы не назвал это хорошим дизайном. Вместо этого вам следует рассмотреть другие способы связи, такие как трубы или сокеты. Это поможет вам в будущем, когда ваш клиент не будет частью вашего сервера.   -  person Some programmer dude    schedule 05.11.2012
comment
В вашем вопросе есть некоторая двусмысленность... Вы упоминаете оба потока (даже с тегом pthreads, который обычно недоступен в Windows) и CreateProcess. Функция CreateProcess создает процесс, а не поток.   -  person Some programmer dude    schedule 05.11.2012
comment
Что касается настройки/получения стандартных дескрипторов ввода/вывода нового процесса, проверили ли вы STARTUPINFO?   -  person Some programmer dude    schedule 05.11.2012
comment
Я не буду создавать клиентское приложение. Я надеялся сделать его как можно более простым для людей, которые будут создавать клиент, поэтому я хотел, чтобы они использовали стандартный вывод. трубы, я боюсь, будут слишком сложны для них. Мой сервер может быть настолько сложным, насколько это необходимо.   -  person Steven Smethurst    schedule 06.11.2012


Ответы (1)


Как отмечают комментаторы выше, именованные каналы (или сокеты) — это способ решения такого рода, и вам, вероятно, нужны два отдельных процесса, а не потоки.

В Windows системный вызов TransactNamedPipe() поможет вам добиться желаемого. Он идеально подходит для отправки команд на сервер и ожидания ответа, что упрощает создание клиента, который выполняет что-то очень похожее на (синхронные) удаленные вызовы процедур на сервер.

person Josh Greifer    schedule 05.11.2012
comment
Я не буду создавать клиентское приложение. Я надеялся сделать его как можно более простым для людей, которые будут создавать клиент, поэтому я хотел, чтобы они использовали стандартный вывод. трубы, я боюсь, будут слишком сложны для них. Мой сервер может быть настолько сложным, насколько это необходимо. - person Steven Smethurst; 06.11.2012