c++ 멀티 캐스트 예제

SOCK_DGRAM 형식의 소켓이 만들어지면 응용 프로그램은 setockopt() 함수를 사용하여 해당 소켓과 연결된 멀티캐스트 특성을 제어할 수 있습니다. setockopt() 함수는 다음과 같은 IPPROTO_IP 수준 플래그를 허용합니다. */ 멀티캐스트를 지원하려면 프로그래밍 API에 대한 몇 가지 확장이 필요합니다. 이들 모두는 두 개의 시스템 호출을 통해 처리됩니다: setockopt() (커널에 정보를 전달하는 데 사용) 및 getsockopt() (멀티캐스트 동작으로 간주되는 정보를 검색하기 위해). 그렇다고 해서 멀티캐스트를 지원하기 위해 2개의 새 시스템 호출이 추가된 것은 아닙니다. 쌍 setockopt ()/getsockopt() 년 동안 거기 있다. 이후 4.2 BSD 적어도. 추가는 커널이 이해해야 하는 이러한 시스템 호출에 전달되는 새로운 옵션(멀티캐스트 옵션)으로 구성됩니다. 전송 시스템이 전송되는 멀티캐스트 데이터그램의 복사본을 받아야 하는지 여부에 따라 IP_MULTICAST_LOOP 소켓 옵션을 설정합니다. 관심 있는 멀티캐스트 그룹을 커널에 알려야 합니다. 그룹에 관심이 없는 프로세스가 없는 경우 호스트에 도착하는 패킷은 삭제됩니다.

관심 커널에 알리고 해당 그룹의 구성원이 되려면 먼저 setockopt() 시스템 호출의 optval 필드에 있는 커널에 나중에 전달되는 ip_mreq 구조를 작성해야 합니다. 두 번째 수준인 수준은 호출하려는 옵션, 메시지 또는 쿼리를 처리할 레이어를 식별합니다. 그래서, SOL_SOCKET은 소켓 레이어, IP층, IP층 등… 멀티캐스트 프로그래밍의 경우 레벨은 항상 IPPROTO_IP입니다. /* imr_multiaddr 필드는 네트워크 바이트 순서로 멀티캐스트 그룹의 32비트 IPv4 주소이며 imr_interface는 멀티캐스트 그룹에 가입할 로컬 인터페이스의 32비트 IPv4 주소입니다(또한 네트워크 바이트 순서로 지정). 다음 코드 코드 조각은 멀티캐스트 그룹에 합류하는 것을 보여 줍니다. /*는 멀티캐스트 */나가는 인터페이스를 결정하거나 선택할 때 다음 ioctls가 유용할 수 있습니다: SIOCGIFADDR(인터페이스의 주소를 얻으려면), SIOCGIFCONF(모든 인터페이스 목록을 얻으려면) 및 SIOCGIFFLAGS ( 인터페이스의 플래그를 얻고, 따라서, 인터페이스가 멀티 캐스트 할 수 있는지 여부를 결정 -IFF_MULTICAST 플래그-). IP_MULTICAST_IF 소켓 옵션을 설정하여 멀티캐스트 데이터그램을 보낼 로컬 인터페이스를 정의합니다. IP_ADD_MEMBERSHIP 소켓 옵션을 사용하여 데이터그램을 받는 멀티캐스트 그룹에 조인합니다. 그룹에 가입할 때 로컬 인터페이스의 IP 주소와 함께 클래스 D 그룹 주소를 지정합니다.

시스템은 멀티캐스트 데이터그램을 수신하는 각 로컬 인터페이스에 대해 IP_ADD_MEMBERSHIP 소켓 옵션을 호출해야 합니다. 응용 프로그램 은 소켓() API 및 연결되지 않은 SOCK_DGRAM 유형 소켓을 사용하여 멀티캐스트 데이터그램을 보내거나 받을 수 있습니다. 호스트에 두 개 이상의 멀티캐스팅 가능 인터페이스가 있더라도 각 멀티캐스트 전송은 단일 네트워크 인터페이스에서 전송됩니다. 달리 지정하지 않으면 멀티캐스트 데이터그램이 기본값이 1로 전송되어 로컬 네트워크 이상으로 전달되지 않습니다.

Posted in Uncategorised