2009-10-24 3 views
0

모든 클라이언트가 std :: map 구조에 저장된 상태로 C++ 비 차단 서버 소켓이 있습니다.C++가 여러 개의 UDP 소켓에 데이터를 전송합니다.

각 클라이언트 객체에 대해 send() 메소드를 호출하여 연결된 클라이언트에게 무언가를 보낼 수 있습니다. 이미 잘 작동합니다.

메시지를 모두에게 보내려면 (브로드 캐스트) 알고 싶습니다. 모든 클라이언트에서/루프를 수행하고 ClientObject-> send ("foo")를 호출 할 때마다 더 나은 방법이 있습니까?

아니면 그냥 멀티 캐스트 소켓을 들여다 봐야합니까?

미리 감사드립니다. Rag.

+2

ASIO 라이브러리를 사용해 보셨습니까? http://asio.sourceforge.net/ –

+0

ASIO 라이브러리가 OP를 얼마나 정확히 지원합니까? – Tom

답변

1

멀티 캐스트는 LAN을 통해 통신하는 경우에만 옵션입니다. 인터넷을 통해 작동하지 않습니다.

비동기 입출력을 사용하여 소켓을 디 멀티 플렉스하는 것이 좋습니다. 이를 통해 동시에 여러 소켓으로 데이터를 전송하고 비동기 이벤트 핸들러를 사용하여 각 전송을 처리 할 수 ​​있습니다.

나는이 작업을 수행 할 수있는 휴대용 방법으로 Boost ASIO를 살펴볼 것을 권장합니다. 또한 OS 특정 시스템 호출 (Linux의 경우 poll/select를 UNIX 또는 epoll과 같이)을 사용하여이 작업을 수행 할 수 있지만 훨씬 더 복잡합니다.

+0

멀티 캐스트는 인터넷을 통해 작동하며 일부 제한 사항과 대부분의 네트워크 관리자가 일반적으로 잊어 버리는 적절한 라우터 구성을 제공합니다. 한 가지 예를 들어, 멀티 캐스트를 통해 BBC의 고품질 라디오를 청취하거나 고품질 TV를 시청할 수 있습니다. http://www.bbc.co.uk/multicast/ – Juliano

1

로컬 노드, 즉 LAN의 "브로드 캐스트/멀티 캐스트"도메인 내에서 이야기하는 한 멀티 캐스트가 훨씬 바람직합니다.

물론 이러한 메시지의 광범위한 분산을위한 멀티 캐스트 배포 프로토콜이 있지만 거의 사용되지 않으며 특정 사례에 따라 신뢰성을 신뢰할 수 없거나 신뢰할 수 없게됩니다.

멀티 캐스트를 사용하면 송신자 관점에서 많은 절약 효과가 있습니다. n * send 대신 하나의 송신 작업 만 수행하면됩니다.

0

매우 비싼 스위치가 없으면 각 호스트에 udp 유니 캐스트를하는 것이 좋습니다. 그렇습니다. 브로드 캐스트/멀티 캐스트는 실제로 PC보다 많은 CPU를 가진 대부분의 스위치에서 느려질 수 있습니다. 단순 포워딩 이외의 다른 작업을 수행하면 속도가 크게 느려집니다.

벤치 마크를 수행하십시오.

0

비동기 소켓 프로그래밍은 확실히 갈 방법입니다! :)

관련 문제