2009-11-12 5 views
0

현재 여러 실행 파일 (음성 채팅 서버)을 생성하는 데 사용하는 작은 Python 스크립트가 있으며 다음 버전의 소프트웨어에서는 서버가 UDP 포트에서 하트 비트 신호를 수신 할 수 있습니다. (하나의 컴퓨터에 수천 개의 서버가 7878 번 포트 이상에 있음)동일한 UDP 포트를 사용하는 여러 프로그램? 가능한?

내 문제는이 서버가 파이썬 스크립트와 동일한 컴퓨터에서 실행 중일 수 있다는 것입니다. UDP 포트를 열어 하트 비트를 보내고 응답을 기다리고 voila ... 작업을 죽이고 서버를 다시로드하여 응답하지 않는 경우 서버를 다시 시작할 수 있습니다.

문제는 서버가 이미 사용하고있는 UDP 포트를 열 수 없다는 것입니다. 이 문제를 해결할 방법이 있습니까? 프로젝트 리더는 여전히 하트 비트를 구현하고 있으므로 하트 비트 시스템을 구현하는 방법에 대한 제안도 환영 할 것입니다. - 이것은 꽤 일반적인 스크립트이지만 다른 프로그램에도 적용 할 수 있으므로 내 주요 관심사는 여전히 해당 UDP 포트에서 통신 중입니다.

답변

2

이것은 불가능합니다. 당신이해야 할 일은 하나의 포트를 통해 모든 UDP 통신을 처리하고 또 다른 방법 (다른 포트, 명명 된 파이프 등의 UDP)과 통신하는 하나의 UDP 마스터 프로그램을 갖는 것입니다.

+0

정의 상으로는 불가능합니다. 포트 당 하나의 프로그램은 UDP (및 TCP)가 작동하는 방식입니다. 하나의 프로그램이 다른 프로그램으로 파견 될 수 있습니다. –

+0

당신이 맞습니다, OS를 통해 불가능합니다. 네트워크 어댑터에 대한 원시 액세스 권한이 있다면 (libpcap 또는 비슷한 방법을 통해) 가능할 수도 있지만 꽤 될 것입니다 ... – Wim

+0

특정 방식으로 하트 비트를 구현하는 것처럼 구현 방식이 있습니까? 브로드 캐스트 패킷을 보낼 수 있으며 응답을 열린 포트로 보낼 수 있습니까? 모든 서버가 패킷을 수신하고 7877에서 회신하도록 지시받을 수 있습니까? - 프로젝트 리드는 내가 의심하는 것과 같은 것들에 열려 있습니다. – ThantiK

1

I ' Linux에서 가능하다는 것을 확신한다. 나는 다른 유닉스에 대해 모른다.

하나 개의 프로세스에서 다른 파일 기술자를 전파하는 방법은 두 가지가 있습니다 :

  • 프로세스 포크()들, 아이가 부모의 모든 파일 디스크립터를 상속합니다.
  • 프로세스는 "UNIX 도메인 소켓"을 통해 파일 디스크립터를 다른 프로세스로 보낼 수 있습니다. sendmsg()recvmsg()을 참조하십시오. 파이썬에서는 _multiprocessing 확장 모듈이이를 처리합니다. _multiprocessing.sendfd()_multiprocessing.recvfd()을 참조하십시오.

UDP 소켓에서 수신 대기하는 여러 프로세스를 실험하지 않았습니다. 그러나 TCP의 경우 리눅스에서 여러 프로세스가 모두 하나의 TCP 소켓에서 수신 대기하는 경우 연결이 들어올 때 무작위로 하나가 선택됩니다. 따라서 Linux가 의심 스럽습니다 무언가 여러 프로세스가 모두 동일한 UDP 소켓.

Google에 알려주세요.

관련 문제