2012-11-05 2 views
3

두 응용 프로그램 중 하나는 클라이언트이고 다른 하나는 서버입니다. 서버는 클라이언트를 서브 스레드로 시작합니다. 클라이언트는 표준 출력을 통해 명령을 출력합니다. 서버는 명령과 응답을 기다립니다.스레드를 사용하여 명령 줄에서 클라이언트/서버 응용 프로그램 통신 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} 

문제는 내가 서버 있도록 함께 두 개의 응용 프로그램을 연결하고 읽기 및 클라이언트 응용 프로그램에 응답하는 방법을 모른다는 것이다.

커맨드 라인을 통신 레이어로 사용하는 이유는 클라이언트 생성을 가능한 한 쉽게 유지하기 위해서입니다.

또한 한 번에 하나 이상의 클라이언트가있을 수 있습니다. 클라이언트는 서로 상호 의존적으로 서버와 통신 할 수 있어야합니다. (그들은 서로의 통신을 볼 수 없어야합니다)

현재 CreateProccess() 함수를 통해 응용 프로그램을 시작하고 있습니다. 이 기능을 사용하면 응용 프로그램의 초기 명령 행 매개 변수를 쉽게 설정할 수 있습니다. 그 이후의 의사 소통이 아닙니다.

내 질문은 :

  • 어떻게 스레드로 클라이언트 응용 프로그램을 시작하는 서버 응용 프로그램은 클라이언트 표준 출력을 쓰기/읽기는 무엇입니까?
+3

가장 먼저해야 할 일은 [파이프를 C++로 만드는 법]입니다 (http://stackoverflow.com/questions/5840109/how-to-make-a-pipe-in -c) – Kiril

+0

stdout을 리다이렉션하는 것은 명명 된 파이프를 사용하는 길고 힘든 방법입니다. CreateProcess()를 이미 사용하고 있다면이 SDK 기사를 참고하십시오 : http://msdn.microsoft.com/en-us/library/windows/desktop/aa365590%28v=vs.85%29.aspx –

+0

당신은 ' 쓰레드를 사용할 때'stdout' /'stdin'을 실제로 사용합니다. 클라이언트를 별도의 _process_에 넣으면 작동하지만 좋은 디자인이라고 부르지는 않습니다. 대신 파이프 나 소켓과 같은 다른 통신 방법을 살펴보아야합니다. 그러면 클라이언트가 서버의 일부가 아닌 _ 미래에 도움이됩니다. –

답변

0

위에서 언급 한 의견에서 지적한 바와 같이 Named Pipe (또는 소켓)는 이러한 종류의 솔루션을 수행하는 방법이며 스레드가 아니라 원하는 두 개의 개별 프로세스입니다.

Windows에서는 TransactNamedPipe() 시스템 호출을 통해 원하는 것을 수행 할 수 있습니다. 서버에 명령을 보내고 응답을 기다리는 데 이상적이므로 서버에 대한 (동기식) 원격 프로 시저 호출과 매우 유사한 작업을 수행하는 클라이언트를 쉽게 만들 수 있습니다.

+0

클라이언트 응용 프로그램을 만들지 않겠습니다.나는 그들이 표준을 사용하기를 원했던 이유 인 클라이언트를 만드는 사람들을 위해 가능한 한 간단하게 유지하기를 바랬다. 내가 두려워하는 파이프는 그들에게 너무 복잡 할 것이다. 내 서버는 복잡 할 수 있습니다. –