2012-06-10 2 views
2

각 프로세스가 다른 시스템과 통신하기 위해 소켓을 생성하기 위해 다른 포트를 선택하도록 컴퓨터에서 서로 조정 된 여러 프로세스가 있어야합니다. 각 프로세스는 사용 가능한 포트 범위에서 포트 번호를 선택해야합니다. 따라서 특정 시점에 하나의 프로세스 만 주어진 포트 번호를 사용합니다.프로세스간에 포트 사용을 어떻게 조정할 수 있습니까?

이 조정을 수행 할 기존 메커니즘이 있습니까? 아니면 자체적으로 구축해야합니까?

현재 디스크의 파일을 사용하여 포트 번호와 해당 포트를 사용중인 PID를 등록합니다. PID가 더 이상 실행되지 않는 항목이 발견되면 프로세스가 비정상적으로 종료 된 것으로 간주되어 항목을 수확해야하므로 항목이 제거됩니다.

그러나 드문 경우처럼 어떤 종류의 경쟁 조건이있는 것 같습니다. 동일한 포트를 사용하는 두 프로세스로 끝나고 두 번째 프로세스는 예약 된 포트를 보여주는 파일 내용을 보지 못하고이를 사용하여 끝납니다 두번째.

이 문제를 해결하기보다는 포트 충돌 방지를 위해 기존 메커니즘을 채택하기 때문에 이러한 유틸리티가 이미 존재하는지 묻습니다.

+0

왜? 소켓 스택은 메시지를 올바른 프로세스로 라우트하도록 설정되므로 같은 포트 번호에서 동일한 서버와 통신하는 여러 프로세스가 여전히 충돌을 일으켜서는 안됩니다. –

답변

1

TCP 또는 UDP와 통신 소켓은 4 튜플에 의해 구별된다

  • 로컬 주소
  • 로컬 포트 ​​
  • 원격 주소
  • 원격 포트

로컬 할당 만 남기고 연결된 프로토콜과 통신하는 경우 connect 호출은 사용 가능한 로컬 포트. 특정 포트 범위로 제한되는 경우 로컬 주소 및 포트 바인딩을 수행해야합니다. 그러나이 경우 각 프로세스는 단일 연결 만 처리하기 때문에 사용 가능한 포트를 찾지 않고 각 포트에 고유 한 포트를 할당합니다.

즉, 다른 모든 프로세스를 시작하는 단일 프로세스가 있다고 가정하면, 단일 프로세스는 프로세스가 어떤 포트를 사용해야 하는지를 결정할 것입니다. 결정이 단일 엔티티에 의해 이루어지기 때문에 이것은 간단합니다, 그래서 같은 간단한 알고리즘을 사용할 수 있습니다 : 아이가 사망

for (unsigned short p = minPort; p < maxPort; ++p) { 
    child_pid = startWorker(p); 
    child_pid_map[child_pid] = p; 
} 

경우, 시동 프로세스가 즉시 해당 포트를 재사용하기 위해 child_pid_map를 참조 할 수 있습니다.

외부 에이전트를 사용하여 포트를 할당 할 수없는 경우 가장 간단한 방법은 범위의 임의의 포트로 bind 전화를 시도하는 것입니다. EADDRINUSE으로 실패한 경우, 성공할 때까지 또는 모든 포트를 시도한 후에 순서대로 다음 포트 번호를 점차적으로 시도하십시오 (필요한 경우 랩핑).

+0

예, 포트는 제한된 범위 내에 있어야합니다. 각 프로세스에는 두 개의 연결이 있습니다. 하나는 TCP 용이고 다른 하나는 UDP 용입니다. 이 질문은 각 프로세스에 고유 한 포트 번호를 할당하는 방법에 대한 것입니다. 시작될 때 어떻게 할당합니까? 그리고 사용 가능한 것을 찾는 것과 어떻게 다른가요? – WilliamKF

+0

@WilliamKF : 프로세스를 시작하는 단일 에이전트가 할당한다는 점이 다릅니다.게시물을 업데이트했습니다. 감사합니다. – jxh

+0

아, 알 겠어.하지만 내 경우에는 다른 모든 프로세스를 시작하는 책임이있는 프로세스가 하나도 없으므로 이러한 접근 방식은 내 역할을하지 못합니다. – WilliamKF

관련 문제