문제

저는 단일 네트워크 내에서 완전히 실행되는 .net 솔루션을 개발 중입니다.사용자가 시스템을 변경하면 공지를 시작하고 다른 모든 사람이이를 듣고 그에 따라 조치를 취하도록하고 싶습니다.보장 된 전달 (예 : TCP)을 유지하면서 이와 같은 메시지를 브로드 캐스트 할 수있는 방법이 있습니까 (UDP가 할 수있는 것처럼)?

작은 네트워크 (30 개 클라이언트)에있는 경우 차이가 있습니다.

도움이 되었습니까?

해결책

거의 모든 게임에는 UDP의 빠르게 반응하는 속성 (그리고 덜 비 연결형 속성)과 TCP의 안정성이 필요합니다. 그들이하는 일은 UDP 위에 신뢰할 수있는 자체 프로토콜을 구축하는 것입니다. 이를 통해 패킷을 어디로 든 버스트하고 선택적으로 안정적으로 만들 수 있습니다.

신뢰할 수있는 패킷 시스템은 일반적으로 TCP보다 간단한 재시도 시스템입니다.하지만 TCP가 제공 할 수있는 것 이상의 프로토콜이 있습니다.

당신의 상황은 매우 간단합니다. 아마도 가장 깨끗한 솔루션을 직접 만들 수있을 것입니다. 모든 클라이언트가 "내 말을 들었습니다"응답을 보내도록하고 서버가 응답을받을 때까지 (또는 포기할 때까지) 계속 시도하도록합니다.

더 많은 것을 원한다면 대부분의 사용자 정의 프로토콜 라이브러리가 C ++로되어 있으므로 얼마나 많이 사용할지 잘 모르겠습니다. 그러나 여기에 대한 나의 지식은 몇 년 전입니다. 아마도 일부 프로토콜은 지금까지 이식되었을 것입니다. 음 ... RakNet과 enet이 떠오르는 두 개의 C / C ++ 라이브러리입니다.

다른 팁

tcp 및 udp 기능이 조합 된 sctp 를 살펴보세요.사용 가능한 창 구현 이 있습니다.

스프레드 를 사용하여 그룹 커뮤니케이션을 수행 할 수 있습니다.

@epatel-저는 SCTP 제안을 두 번째로했습니다 (투표했지만 아직 여기에 추가 내용에 대해 댓글을 달 수 없습니다).

SCTP에는 많은 뛰어난 기능과 유연성이 있습니다.연결을 여러 스트림으로 세분화하고 각각의 신뢰성과 순서 여부를 선택할 수 있습니다.또는 부분적 안정성 확장을 사용하여 메시지별로 안정성을 제어 할 수 있습니다.

방송은 원하는 것이 아닙니다.메시지에 신경 쓰지 않는 장치가이 네트워크에 연결되어있을 수 있으므로 멀티 캐스트를 사용해야합니다.네트워크의 모든 클라이언트에 전송되고 처리되어야하는 브로드 캐스트 메시지와 달리 멀티 캐스트 메시지는 관심있는 클라이언트 (예 : 이러한 특정 유형의 메시지를 수신하고 조치를 취하려는 의도가있는 클라이언트)에게만 전달됩니다.

나중에이 시스템을 확장하여 대규모 네트워크를 통해 라우팅해야하는 경우 멀티 캐스트는이를 확장 할 수 있지만 브로드 캐스트는 그렇지 않으므로 나중에 평가할 수있는 확장 성 이점을 얻을 수 있습니다.한편 이러한 "변경된 사항"메시지를 볼 필요가없는 스위치 및 기타 장치에서 불필요한 오버 헤드를 제거합니다.

RFC 3208 "PGM 신뢰할 수있는 전송 프로토콜 사양"을 살펴볼 수 있습니다.

추상은 다음과 같습니다. <인용구>

PGM (Pragmatic General Multicast) 신뢰할 수있는 멀티 캐스트 전송입니다.
필요한 애플리케이션을위한 프로토콜 주문 또는 미 주문,
중복없는 멀티 캐스트 데이터 여러 소스에서
여러 수신기.PGM 보증 그룹의 수신자도 모든 데이터 패킷을 전송 및 수리, 또는 복구 불가능한 데이터 감지 가능 패킷 손실.PGM은 구체적으로 실행 가능한 솔루션으로 의도 기본 멀티 캐스트 응용 프로그램 신뢰성 요구 사항.중앙 디자인 목표는 적절한 고려 작업 확장 성 및 네트워크 효율성.

ActiveMQ 와 같은 메시지 브로커를 사용할 수 있습니다.
주제에 메시지를 게시하고 클라이언트가 주제에 대한 영구 구독을 등록하도록하여 온라인 상태가 아니더라도 메시지를 놓치지 않도록합니다. <인용구>

Apache ActiveMQ는 메시지 브로커입니다. 전체와 함께 Java로 작성 JMS 클라이언트.그러나 Apache ActiveMQ는 숫자를 통해 통신하도록 설계 Stomp 및 OpenWire와 함께 특정 언어의 수 클라이언트.

클라이언트 플랫폼 지원에는 C # 및 .net이 포함됩니다.

응용 프로그램 계층에서 TCP와 유사한 동작을 구현할 수 있습니다.

예를 들어 UDP 브로드 캐스트를 보낸 다음 각 호스트로부터 응답 응답을 기대합니다.X 초 내에 응답을받지 못하면 일종의 임계 값에 도달 할 때까지 다른 메시지를 보내십시오.임계 값에 도달하면 (예 : 호스트가 전혀 응답하지 않음) 오류를보고합니다.

이렇게하려면 응답을 다시받을 수 있도록 사전 정의 된 호스트 목록이 필요합니다.

TCP 서버를 만듭니다.각 클라이언트를 연결하십시오.클라이언트가있는 TCP 프로토콜에서 다음 메시지의 총 크기의 2 바이트 접두사를 사용하여 각 패킷을 만듭니다.

그런 다음 클라이언트는 소켓에서 read(max_size=2)를 호출하여 다음 메시지의 크기를 결정한 다음 read(max_size=s)를 호출하여 메시지를 수집합니다.

신뢰할 수 있고 정렬 된 메시지를 간단하게 얻을 수 있습니다.이 경우 메시징 프레임 워크가 필요하지 않습니다.

확실히 Pragmatic General Multicast 를 살펴보고 싶을 것입니다.: <인용구>

TCP가 ACK를 사용하여 전송 된 패킷 그룹을 확인하는 동안 ( 멀티 캐스트를 통해 비 경제적 일 수 있음 ) PGM은 Negative Acknowledgments (NAK) 개념을 사용합니다.

추가 G-diving 의 경우 찾고있는 용어는 신뢰할 수있는 멀티 캐스트 . 다중 경로 TCP 도 살펴보세요.

할 수있는 일은 브로드 캐스트 후 클라이언트 가 tcp 연결을 시작하도록하는 것입니다.그렇지 않으면 모든 클라이언트 목록을 유지하고 각 클라이언트에 대한 연결을 직접 시작하면됩니다.

대체적으로 말하면 세 가지 옵션이 있다고 생각합니다.

  1. UDP를 브로드 캐스팅하는 대신 구독자 목록을 유지하고 그들에게 유니 캐스트 UDP 메시지를 보내는 엔티티 (스레드, 프로세스, 서버, 서비스 또는 솔루션에있는 모든 것)를 만들 수 있습니다.
  2. UDP 멀티 캐스트를 사용하지만 안정적인 전달을 처리 할 수있는 일종의 메커니즘 (예 : 재시도, 시간 초과 등)을 작성해야합니다.이것은 또한 고객으로부터 답변을 받아야 함을 의미합니다.
  3. 실험적인 전송 프로토콜을 두려워하지 않는다면 여기 제안.,

Yoy는 Norm (NACK-Oriented Reliable Multicast) 사양을 살펴 봐야합니다. 여기에서 Norm에 대한 정보 를 찾을 수 있습니다. <인용구>

NORM 프로토콜은 신뢰할 수있는 종단 간 전송 제공 대량 데이터 개체 또는 스트림 일반 IP 멀티 캐스트 라우팅 및 포워딩 서비스.NORM은 선택적, 부정적 인정 (NACK) 전송 메커니즘 신뢰성 및 추가 제공 수행 할 프로토콜 메커니즘 신뢰할 수있는 멀티 캐스트 세션 제한된 "선험적"조정 발신자 및 수신자

군사 계에서 꽤 잘 알려져 있습니다.

규범 사양

Norm Source

라이브러리를 사용할 수 있는데 왜 처음부터 새로 만들까요?특히 그렇게 작은 프로젝트에요?

안정적인 멀티 캐스트 메시징 (PGM)을 자체적으로 사용하는 Emcaster 를 사용해보십시오.NET 및 전체 소스.주제 필터링을 쉽게 사용할 수있는 멋진 pub / sub 엔진을 얻을 수 있습니다.또는 코드에서이를 수행하는 방법을 배우고이를 기반으로 자체 확장을 만들 수 있습니다.

이 시나리오에서 TCP의 가장 짜증나는 기능은 들어오는 패킷을 원래 순서로 정렬하는 기능 / 방법 인 스트림 개념이라고 생각합니다.바이트가 도착하기 전에 바이트를 읽을 수 없습니다.

당신이 그것없이 살 수 있다면, 당신은 당신의 프로토콜을 빠르고 믿을 수있는 기회를 가질 수 있습니다. 그러나 패킷의 주문은 아닙니다!손실 된 패킷의 다른 사본을받을 때까지 바이트를 주문할 수 없기 때문에 둘 다 관리하는 것이 불가능합니다. 이것이 주요 트레이드 오프입니다.

RDP 멀티 캐스트를 수행합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top