제 14장 Multicast & Broadcast TCP/IP Socket Programming… 제 14장 Multicast & Broadcast 시뮬레이션 실험실 정진구 Jkjeong@hannam.ac.kr
목 차 멀티캐스트(Multicast) 브로드캐스트(Broadcast)
멀티캐스트(Multicast) 전송 방식 UDP를 기반으로 하는 전송 방식. 멀티캐스트 그룹을 기반으로 멀티캐스트 패킷을 주고 받음. 하나의 멀티캐스트 패킷은 라우터를 통해서 다수의 호스트에 전송.
멀티캐스트(Multicast) 라우팅(Routing)과 TTL(Time To Live) 라우터에 의해서 패킷이 경로를 찾는 과정을 라우팅이라 한다. 멀티캐스트 패킷 내에는 TTL 정보가 포함된다. TTL은 거쳐 갈 수 있는 라우터의 수를 의미한다
멀티캐스트(Multicast) 멀티캐스트 Sender와 Receiver. 멀티캐스트 Sender와 Receiver의 구현 • UDP 소켓 생성. • TTL 설정(소켓 옵션 설정). • 멀티캐스트 그룹으로 데이터 전송. • 멀티캐스트 그룹 지정 (ip_mreq 구조체). • 멀티캐스트 그룹 가입 (소켓 옵션 설정).
멀티캐스트(Multicast) 멀티캐스트 Sender 예제 : #define TTL 64 send_sock=socket(PF_INET, SOCK_DGRAM, 0); /*멀티캐스트를 위한 UDP소켓 생성 */ if(send_sock == -1) error_handling("socket() error"); memset(&multi_addr, 0, sizeof(multi_addr)); multi_addr.sin_family=AF_INET; multi_addr.sin_addr.s_addr=inet_addr(argv[1]); /* 멀티캐스트 IP 설정 */ multi_addr.sin_port=htons(atoi(argv[2])); /* 멀티캐스트 port 설정 */ state=setsockopt(send_sock, IPPROTO_IP, IP_MULTICAST_TTL, (void*) &multi_TTL, sizeof(multi_TTL));
멀티캐스트(Multicast) 멀티캐스트 Sender 예제 : if((fp=fopen("News.txt", "r"))==NULL) /* news 파일 오픈 */ error_handling("fopen() error"); while(!feof(fp)){ /* news 방송 */ fgets(buf, BUFSIZE, fp); sendto(send_sock, buf, strlen(buf), 0, (struct sockaddr*)&multi_addr, sizeof(multi_addr)); sleep(2); }
멀티캐스트(Multicast) 멀티캐스트 Sender 실행결과
멀티캐스트(Multicast) 멀티캐스트 Receiver 예제 : int recv_sock; struct sockaddr_in addr; int state, str_len; char buf[BUFSIZE]; struct ip_mreq join_addr; recv_sock=socket(PF_INET, SOCK_DGRAM, 0); /*멀티캐스트를 위해 UDP소켓 생성 */ if(recv_sock == -1) error_handling("socket() error"); addr.sin_port=htons(atoi(argv[2])); /* 멀티캐스트 port 설정 */
멀티캐스트(Multicast) 멀티캐스트 Receiver 예제 : join_addr.imr_multiaddr.s_addr=inet_addr(argv[1]); join_addr.imr_interface.s_addr=htonl(INADDR_ANY); state=setsockopt(recv_sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, (void*)&join_addr, sizeof(join_addr)); while(1){ str_len=recvfrom(recv_sock, buf, BUFSIZE-1, 0, NULL, 0); if(str_len<0) break; buf[str_len]=0; fputs(buf, stdout); }
멀티캐스트(Multicast) 멀티캐스트 Receiver 실행결과
브로드캐스트(Broadcast) 전송 방식. UDP를 기반으로 하는 전송 방식(멀티캐스트와 같다). 일반적인 UDP 패킷과의 차이점은 전송 목적지 IP주소 뿐이다. 동일 네트워크에 속하는 모든 호스트에 동시 전송(멀티캐스트와의 차이점). 인터넷상에서는 지역 네트워크내에서만 브로드캐스트를 허용한다(네트워크의 부하를 고려).
브로드캐스트(Broadcast) 주소선택에 따른 브로드캐스트 방식의 구분. 지정된 브로드캐스트 : 예 192.12.31.255 192 12 31 xxx 네트워크 IP 호스트 IP 255 브로드캐스트 address 지역적 브로드캐스트 : 예 255.255.255.255
브로드캐스트(Broadcast) 브로드캐스트 Sender 예제 : send_sock=socket(PF_INET, SOCK_DGRAM, 0); /*브로드캐스트를 위해 UDP소켓 생성 */ : state=setsockopt(send_sock, SOL_SOCKET, SO_BROADCAST, (void*)&so_broadcast, sizeof(so_broadcast)); if((fp=fopen("News.txt", "r"))==NULL) /* news 파일 오픈 */ error_handling("fopen() error"); while(!feof(fp)){ /* news 방송 */ fgets(buf, BUFSIZE, fp); sendto(send_sock, buf, strlen(buf), 0, (struct sockaddr*)&broad_addr, sizeof(broad_addr));
브로드캐스트(Broadcast) 브로드캐스트 Sender 실행결과
브로드캐스트(Broadcast) 브로드캐스트 Receiver 예제 : recv_sock=socket(PF_INET, SOCK_DGRAM, 0); /*브로드캐스트를 위한 UDP소켓 생성 */ : memset(&addr, 0, sizeof(addr)); addr.sin_family=AF_INET; addr.sin_addr.s_addr=htonl(INADDR_ANY); addr.sin_port=htons(atoi(argv[1])); /* 브로드캐스트 port 설정 */ if(bind(recv_sock, (struct sockaddr*)&addr, sizeof(addr))==-1) error_handling("bind() error");
브로드캐스트(Broadcast) 브로드캐스트 Receiver 실행결과
참고문헌 “TCP/IP 소켓 프로그래밍” , 윤성우 저 “TCP/IP 네트워크”, 정진옥 외2
Q & A