2013-05-23 21 views
1

클라이언트 프로세스에서 xinetd를 사용하여 서버 프로세스를 시작하도록하고 있습니다. 내가 이해할 때, 서버는 STDIN을 통해 클라이언트로부터 읽을 수 있고 STDOUT을 통해 클라이언트에 쓸 수있는 삶을 살아 간다. 여러 가지 이유 (주로 서버 select() 및 read() 또는 recv()) 사용할 수 있습니다. 어떻게 든 STDIN 및 STDOUT 소켓으로 변환 할 수 및 일반 소켓 I/O 수행 할 수 싶습니다. 내 서버가 연결할 다른 서버와 마찬가지로STDIN/STDOUT을 소켓으로 사용하기

이 작업을 수행 할 수 있습니까? 이것은 심지어 의미있는 질문입니까?

답변

1

모든 기능을 사용하면 숫자 STDIN_FILENO과 (<unistd.h>에서) STDOUT_FILENO와 파일 기술자 사용할 수 있습니다 언급 호출합니다. 그래서 저는 변혁이 필요 없다는 것을 확신합니다.

EDIT : 다소 정통 적이지만 STDOUT_FILE에 글쓰기를 시도 했습니까? 아니면 STDIN_FILENO를 서버에서 읽으려고 했습니까? xinetd 코드를 매우 빠르게 살펴봄으로써 서버의 모든 fds에 대해 열린 소켓 fd를 dup()하는 것처럼 보입니다. 어쩌면 둘 중 하나를 전이중으로 사용할 수 있습니다.

나는 단지 알고 확실히 좋은 here

for (fd = 0 ; fd <= MAX_PASS_FD ; fd++) 
    { 
     if (dup2(descriptor, fd) == -1) 
     { 
    msg_resume(); 
     msg(LOG_ERR, func, 
       "dup2(%d, %d) failed: %m", descriptor, fd) ; 
     _exit(1) ; 
     } 
    } 
+0

을 보였다. 저의 유일한 망설임은 이전에 설계된 서버가 모든 연결을위한 실제 소켓이 있고 데이터 구조와 알고리즘이 각 소켓이 양방향이라고 가정 한 것과 같이 다른 방식으로 시작되었습니다. 그래서, * 이상적으로, 나는 어떻게 든 STDIN/OUT을 소켓으로 변환하고 현존하는 코드를 그대로 사용할 수있을 것이다. (그렇지 않으면 나는 STD 파일 디스크립터를 특별하게 사용한다.) – Chap

+0

EDIT : 테스트 서버를 실행했다 : ** my $ input = ; ** ** log_info ($ me, "Read '$ input'from 클라이언트. "); ** ** STDIN"안녕하세요 클라이언트 \ n "; ** 과 IO :: Socket을 열고 클라이언트에"hello "를 인쇄 한 다음 시도한 클라이언트를 인쇄하십시오. 그것에받을 수 있습니다. 서버가 내 hello를 받았지만 STDIN에 오류가 발생했습니다 : ** Filehandle STDIN은 입력 용으로 만 열렸습니다 **. 필자는 Perl에서 FILENO 수준으로 작업하는 방법을 알지 못하기 때문에 이것이 정확하게 당신의 제안을 표현한 것인지 모르겠습니다. – Chap

+0

아, Perl을 사용하고 있다는 것을 깨닫지 못했습니다. C 언어의 특정 답변으로 당신을 혼란에 대한 사과. – thuovila