2011-03-25 10 views
1

나는 클라이언트의 요청에 따라 하나의 프로세스 (자식)를 생성하는 (Linux에서 fork()에 의해) 다중 프로세스 TCPServer를 가지고 있고 다른 한편으로는 다른 연결의 요청을 듣고있다. 그래서 클라이언트와 서버 사이에 1 대 1 매핑이 있습니다. 하나의 클라이언트가 다운 된 경우 같은 하위 서버 프로세스에 다시 연결할 수 있습니까? 다른 말로하면 실패한 이전의 연결을 복원하거나 다시 연결하려는 시도를 새 연결로 만들 수 있습니다 (그런 다음 새 하위 서버 프로세스)? 고마워요 ...동일한 TCP 연결을 재개

답변

2

내부 세션 관련 세부 정보 (forkee)에 대한 일부 지식이없는 경우 (forkee의) 내부 연결과 관련된 세부 정보가 적절하면 외부 연결이 다시 연결되는지 확인해야합니다. 어떤 로컬 연결 끝점.

하지만 애플리케이션에서 작동하는 방식을 변경할 수 있습니다. Oracle SQL * Net은 플랫폼에 따라 일부 플랫폼에서이 작업을 수행합니다.

TCPServer에 처음으로 연결하면 포크 and then opens up a new listening socket이 발생하여 새 청취 소켓 &에 연결하기위한 리디렉션 지침이 다시 전송되어 다른 사람이 원래 커넥터에 연결되어 가장하지 못하게합니다. 그런 다음 클라이언트는 새 소켓에 연결하고이 소켓을 사용하여 연결 해제 전에 재 연결을 수행합니다.

+0

당신은 빠른 응답을위한 사람들입니다 ... 제 코드는 C++이며이 언어는 필수입니다 ... 그래서이 상황에서 해결책을 찾아야합니다 ... @ stefan IMEI는 무엇을 의미합니까? 그것은 연결의 univoque 식별자입니다 ..하지만 당신은 내게 더 자세한 정보를 줄 수 있습니까? – marco

0

.NET 플랫폼에서 이와 비슷한 작업을 수행했습니다. 모든 연결에 대해 고유 한 것이 있다면 (예 : 연결 장치의 IMEI가 가능합니다.) ProcessID와 IMEI의 조합으로 전역 2 차원 배열 변수가 있어야합니다. 따라서 장치가 분리 된 후 장치가 다시 연결되면이 배열에서이 IMEI 만 검색하면이 장치에 대한 프로세스가 제공됩니다. 이 전역 변수에 매우주의해야합니다.

편집 : 몇 가지 고유 한 식별자의 예를 들었습니다. 제 경우에는 그것은 장치의 IMEI였습니다. 당신의 경우에는 그게 당신이 알고있는 다른 것이 될 수 있습니다 그것은 독특합니다. 연결을 끊는 장치에 큰 문제가 있었기 때문에이 작업을 수행해야했습니다. 모든 새로운 장치가 새로운 연결 이었기 때문에 나중에 매우 큰 CPU 사용으로 끝났습니다.

+0

ok 나는 이해한다. 그래서 나는 새로운 연결이 도착할 때마다 이전에 연결된 클라이언트에서 온 것이거나 새로운 클라이언트 인 경우 전에 제어해야한다. 첫 번째 경우 이전 소켓 서버의 자식 프로세스에 소켓 설명자를 전달해야합니까? 발생하지 않은 것처럼 연결을 복원하는 것으로 충분합니까? – marco

+0

이전 프로세스로 넘어 가지 않고 오래된 프로세스를 닫습니다. 새 프로세스를 이미 받아 들인 경우 (내 경우에는 이와 같았습니다). 따라서 새로운 연결이있을 때 (새 프로세스에서 허용됨) 배열에서 ID를 검색합니다. ID가 있으면 그 프로세스를 죽이고 새로운 ID를 배열 –

+0

@Stefan과 함께 추가하십시오. 답변 중 하나를 편집하여 두 질문을 하나로 결합하고 다른 질문을 삭제하는 것이 좋습니다. 그것은 당신의 대답을 철저히 따라갈 수있게 해줍니다. – Jeff

관련 문제