2012-10-22 3 views
5

소켓을 청취하고 클라이언트 연결을 기다린 다음 연결이 설정되는 즉시 시작하는 다른 응용 프로그램에 연결을 전달하려는 시스템이 있습니다.소켓을 다른 포트로 라우팅

이 다른 응용 프로그램에 대한 제어 권한이없고 수신 대기 포트 만 설정할 수 있지만 각 새 클라이언트에 대해 하나의 프로세스가 필요합니다.

routing

내가이 솔루션을 찾고 있었어요,하지만 난 것은 내가 올바른 용어가없는,하지만 난에 찾을 관리 :

내가 할 노력하고있어입니다 Richard Stevens의 "Unix Network Programming"은 AF_ROUTE 소켓 군에 대해 SOCK_RAW과 결합하여 다른 IP 및 포트로 연결을 라우팅 할 수 있습니다. 그러나 how to use this flag에 대한 설명서가 너무 적으며 수퍼 유저 권한 (필자는 피하고 싶습니다)이 필요합니다.

아마도 더 쉬운 해결책이있을 수 있지만 잘못된 용어를 사용하고있을 가능성이 있습니다. 내가 뭘하고 싶은지 분명하니?

+0

은 앱과 포트 1 : 1 매핑입니까? 그렇다면 왜 그들은 자신의 말을들을 수 없습니까? – SparKot

+0

@SparKot 정확하지 않습니다. 새로운 각 클라이언트에 대해 새로운 "APP"를 열어야합니다. – JBernardo

+0

다른 응용 프로그램이 다른 파일 설명자 (예 : stdin)를 읽도록 유도 할 수 있습니까? 그렇다면, 당신은 stdin에 fd를'dup2 '하고 다른 응용 프로그램을 fork + exec 할 수 있습니다. –

답변

0

특히 "APP"를 변경하고 다시 컴파일 할 수없는 경우 원하는대로 소켓을 "전달"할 수 있다고 생각하지 않습니다. 소켓에는 소유하고있는 프로세스와 연결된 다양한 관리 오버 헤드 (자원 관리 등)가 포함됩니다. 또한 APP를 다시 컴파일 할 수 없다면 연결을 수락하는 단계를 거치지 않고 공유기에서 이미 연결된 "열린 상태"로 연결되도록 할 수있는 방법이 없습니다.

그러나 단순히 라우터를 통과로 생각 했습니까? 기본적으로 "라우터"프로세스가 소켓을 통해 연결되는 각 "APP"프로세스에 연결하고 해당 클라이언트에서 수신 한 모든 내용을 해당 APP로 반향 출력하고 APP에서 클라이언트로 전송합니다.

이것은 오버 헤드를 추가하고 어떤 클라이언트가 어떤 앱으로 이동했는지 추적하기 위해 작은 매핑을 관리해야하지만 작동 할 수도 있습니다 (APP 또는 클라이언트가 IP 주소를 기반으로하지 않는다고 가정). 그들은 등에 연결되어있다). APP를 다시 컴파일 할 수 없다고 가정하면 다른 옵션이 너무 많지 않을 수 있습니다.

이 코드는 비교적 간단합니다. APP에서받은 데이터에 대한 핸들러는 매핑에서 해당 앱의 소켓을 검색 한 다음이 데이터를 차단하지 않은 상태로 보냅니다. 마찬가지로 클라이언트에서 수신 한 데이터 처리기입니다. 클라이언트와 앱의 행동 방식에 따라 약간의 동기화를 처리해야 할 수도 있습니다 (동시에 둘 다받는 경우).

+0

소켓에서 실제로 읽고 쓰고 싶지 않았기 때문에 양쪽 끝을 통신 할 수 있습니다. 아마도이 파일 설명자에서 읽은 "APP"가 될 수 있습니다. – JBernardo

+0

hrm, 어쩌면 당신은 APP가 할 수 있고 할 수없는 것을 명확히하기 위해 질문을 편집해야합니까? "나는이 다른 응용 프로그램에 대한 제어권이없고 오직 들어야하는 포트를 설정할 수 있습니다"라고 읽는 방식으로 소켓에서 읽어야 만하는 다른 옵션이 없다는 것을 해석하게되었습니다.APP에 stdin/out과 같은 다른 I/O 옵션이 있거나 어쩌면 다른 명령 줄 매개 변수를 사용하여 답변을 얻을 수 있습니다. – davec

+0

Adam Rosenfield의 위의 설명은 내가 할 수 있다고 생각하지 않았습니다. 옵션이 될 수 있습니다. 나는 지금 그것을 시도하고있다. 그러나 그것이 효과가 있을지 모른다. – JBernardo

관련 문제