2011-03-18 5 views
2

서버가 주 프로세스이고 클라이언트가 자식 프로세스 인 클라이언트 - 서버 프로그램을 만들고 싶습니다. 클라이언트에서 자식 프로세스의 stdout 및 stderr 스트림을 소켓으로 리디렉션하려고합니다. 서버에서 소켓 파일 디스크립터를 만들고 읽고 싶습니다. 인터넷에 소켓에 ​​대한 많은 정보가 있지만 Windows 용 소켓을 통해 부모 - 자식 IPC의 예를 발견하지 못했습니다.자식 프로세스의 stdout (stderr)을 winapi의 소켓으로 리디렉션하는 방법은 무엇입니까?

가능한 경우 내 문제 (또는 부분)를 해결하는 간단한 코드를 게시하십시오. msdn에 대한 링크도 도움이 될 수 있습니다. 그러나 나는 이미 거기에서 모든 것을 찾아 보았고 내가 원하는 것을 발견하지 못했습니다.

P. 제발 파이프를 제안하지 마세요. 소켓을 통해이 작업을 수행하려고합니다.

+0

이것은 매우 구체적인 구현이 될 것입니다. Windows 만이 유일한 플랫폼 및 운영 체제 요구 사항이라고 가정합니다. 어떤 컴파일러, IDE 및 라이브러리를 사용할 의향이 있습니까? – AJG85

+0

Visual Studio를 사용하고 있습니다. standart 라이브러리와 winapi를 사용하고 싶습니다. socket2를 선호합니다. Cygwin 라이브러리를 사용할 수도 있습니다. –

+0

소켓에서 연결하기 - 연결 + 소켓 연결 또는 IO 리디렉션 중 어떤 부분에 문제가 있습니까? – Rup

답변

1

Netcat이 문서를 사용하거나 소스 포지 (sourceforge)의 어딘가에있는 소스를 찾을 수 있다면이 파이프를 사용하여 stdin/stdout을 가로 채고 해당 파이프가있는 소켓에서 보내고 읽을 수 있습니다.

나는 파이프가 없다고 알고 있지만 Windows API만으로이 작업을 수행 할 수있는 다른 방법은 없습니다.

CreatePipe

WriteFile

이 그 시작 후 불을 넣어 시도처럼 ReadFile

+0

감사합니다. 하지만 이미 파이프를 통해이 작업을 수행했습니다.))하지만 문제는 없습니다. pipe는 소켓이 필요한 select()를 지원하지 않습니다. –

+0

오버랩 된 I/O 모델과 'WaitForMultipleObjects'를 사용하여 여러 파이프를 읽고 관리 할 수 ​​있습니다. 그것은 소켓리스트에서'Select()'만큼 좋지는 않지만 그것을 _faking_ it 방법입니다. 서버로 리디렉션해야하는 클라이언트가 얼마나 있습니까? – AJG85

+0

예 @ AJG85 나는 이렇게 할 수도있다. 그러나 또 다른 문제가 있습니다. 이 방법을 사용하면 비 차단 모드에서 양식 파이프를 읽어야합니다. 창에서 파일 핸들을 비 블로킹으로 만들 수는 없습니다. 저레벨 ReadFile 함수를 통해서만 비 블로킹 모드로 읽을 수 있습니다. 하지만이 핸들에서 FILE *을 만들고 fgets를 통해 읽고 싶습니다. –

0

, 당신은 방지하기 위해 노력한다 : 당신은 아마 최소한 다음이 필요합니다 화재는 처음부터.

stdout/stderr을 잡아서 그 시점에 소켓으로 리디렉션하려고하지 않고 server.exe와 client.exe의 작성자이기 때문에 클라이언트를 다시 설계하여 ' stdout으로 향하는 텍스트를 잡기 전에, stdout으로 이동하기 전에.

그 시점에서, 출력 텍스트를 양쪽 출력으로 보내고, 원한다면 소켓을 보낼 수 있습니다.

편집 : 나중에 클라이언트의 작성자가 아니라고 했으므로 상위 절반을 무시하십시오.

좋아, 두 번째 시도 :

당신이 "가짜"클라이언트를 사용하여, "진짜"클라이언트를 산란되기 때문에, 당신은 왜 그냥 "가짜"의 표준 입력에 "실제"클라이언트의 표준 출력 가로 챌 할 클라이언트 (파이프 열기). 그런 다음이 "가짜"클라이언트가

+0

난 진짜 클라이언트의 작성자가 아니야. 나는 단지 서버에 연결해야만하는 가짜 클라이언트의 저자이며, stdout 및 stdoerr을 리디렉션해야하는 실제 클라이언트를 생성합니다. –

+0

@J T @ AJG85s의 의견보기 응답 –

+0

"가짜"클라이언트와 "진짜"클라이언트 사이에서만 클라이언트와 서버간에 파이프를 열지 않는 것이 좋습니다. "Fake"클라이언트는 여전히 소켓을 통해 데이터를 전송하므로 서버는 들어오는 모든 요청을 다중화하고 하나의 프로세스에서만 실행할 수 있습니다. –

0

가정하면 .. 다시 소켓에 데이터를 전송 :

server talks with client 

하고 여기에

client spawns child 

는 불행하게도 Child Process with Redirected IO

를 만들 수 MSDN에서 예입니다, 자식 프로그램에서 클라이언트로 IO를 가져 오기 위해 반드시 파이프를 사용해야합니다. 그것에 관한 ifs, ands 또는 buts은 없습니다.

그런 다음 당신이 좋아하는 무언가를 사용할 수있는 서버에 정보를 얻기 위해 다음

클라이언트 COMMS 루프 :

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

@Chris 뭐라고 하시겠습니까? –

+0

나는 파이프를 제안하지 않기 위해 질문에 썼다. –

+0

Mihran, 실행 가능한 "실제"클라이언트를 수정할 수없는 경우 STDOUT/ERR을 차단해야합니다. 파이프 사용을 재검토해야합니다. –

0

내가 이것을 지원하는 유일한 환경은 Cygwin입니다. 그것들은 오픈 소스입니다 - 아이디어를위한 코드를 열람하려고 노력하십시오. 하지만, 실제로 쓰레기를 펌핑하는 것과 같은 것들로 정말 더러워졌습니다.

관련 문제