2011-03-30 2 views
1

UDP를 사용하여 단일 시스템이나 네트워크를 통해 프로그램의 다양한 인스턴스간에 메시지를 교환하는 GNU/Linux의 C 프로그램을 작성하고 있습니다. 프로그램의 각 인스턴스에는 고유 한 내부 응용 프로그램 계층 주소가있어 단일 시스템에서 실행되는 인스턴스를 구별하는 데 사용됩니다 (따라서 IP 주소를 공유 함). 현재 전체 시스템은 단일 UDP 포트에서 통신합니다.UDP C 소켓 : 단일 소켓을 공유하는 다중 소켓

이것은 서로 다른 컴퓨터에서 실행되는 프로그램 인스턴스 간에는 고유 한 IP 주소가 있으므로 고유 한 소켓 연결을 사용하기 때문에 정상적으로 작동합니다. 문제는 단일 시스템에서 여러 인스턴스를 실행하는 것입니다. 이 경우 프로그램의 첫 번째 인스턴스 만 소켓 연결을 얻고 다른 포트는 이미 사용 중이므로 실패합니다.

여러 개의 데이터 그램 소켓을 단일 포트에 바인딩하는 방법이 있습니까? 이것이 일반적으로 권장되지는 않지만, 모호성을 해결하는 데 사용할 수있는 고유 한 응용 프로그램 계층 주소가 있으므로이 경우 도움이됩니다. 기본적으로 다음 작업을 수행 할 수 있도록하려면 : 메시지를 수신 동일한 공통 프로토콜 포트

  • 에 단일 시스템에서 프로그램의

    1. 바인딩 모든 인스턴스를, 각 인스턴스는 함께 RECV을 사용합니다 메시지의 응용 프로그램 계층 주소가 인스턴스의 내부 주소와 일치하는지 확인하기 위해 설정된 MSG_PEEK 플래그.
    2. 주소가 일치하는 지정된 시스템에서 단일 인스턴스의 경우 recv에 대한 일반적인 호출은 해당 인스턴스에서 처리하기 위해 입력 대기열에서 메시지를 제거합니다.

    기본적으로 응용 프로그램 계층에서보다 구체적인 주소 지정을 사용하여 일반적인 통신 매체로 UDP를 사용하고자합니다.

    GNU C에서 이것을 수행하는 표준 방법이 있습니까? 소켓에있는 모든 메시지를 듣고 적절한 인스턴스로 경로를 변경하는 최상위 제어 프로그램을 작성할 수는 있지만 이것이 불필요하게 복잡해 보이고 공유 된 단일 시스템에서 네트워크를 통해 여러 인스턴스와 동일하게 작동하는 프로그램을 중단시킵니다. IP. 또한 여러 포트를 사용할 수 있다는 것도 알고 있지만 각 인스턴스에 별도의 빈 포트를 할당하고 인스턴스 전체 네트워크에서 이러한 포트를 추적해야합니다.

    기본적으로 단일 IP 주소를 공유하는 인스턴스 그룹에 메시지를 "브로드 캐스팅"하여 메시지가 속한 사용자를 응용 프로그램 계층에서 분류 할 수 있습니다.

    생각하십니까?

  • 답변

    1

    setsockopt (SO_REUSEPORT)와 같은 바인딩을 할 수 있지만 도움이되지는 않을 것입니다. 각각의 패킷 대기열을 가진 소켓이 여러 개 있고 각 패킷은 하나의 대기열에만 들어갑니다. MSG_PEEK는 좋지 않습니다.

    다른 소비자에게 메시지를 라우팅하는 최상위 인스턴스는 올바른 해결책처럼 보입니다.

    0

    고유 한 IP/포트 조합에 바인딩 된 다중 소켓을 사용할 수 없습니다.

    일부 메시지 대기열/메시지 전달 인터페이스를 사용하고 UDP는 잊어 버리십시오. 예 : 0MQ (제롬) http://www.zeromq.org/

    0

    클라이언트/서버 스타일 앱인 경우 클라이언트 측을 바인딩 할 필요가 없습니다.

    서버가 바인딩되지 않은 클라이언트에 응답하면 클라이언트가 (바인딩없이) 보낼 때 OS가 임의로 선택한 원본 포트에 응답합니다. 그러면 클라이언트가 언 바운드 포트에서 읽습니다.