본문 바로가기

CS 프로그램/개발

TCP/IP 소켓프로그래밍 : 멀티캐스트, 브로드캐스트 구축

멀티캐스트

그룹단위로 데이터 전송을 할 수 있는 방법

 

그룹에 호스트가 많이 연결되어있을 때 TCP로 진행하면 모든 소켓에 같은 데이터를 뿌려줘야한다. 

멀티캐스트는 UDP를 사용하여 연결 없이 라우터에 데이터를 보내고, 라우터가 그룹에 데이터를 뿌려주는 역할을 한다.

멀티캐스트 그룹의 수는 멀티캐스트용으로 예약된 IP 주소의 범위 내에서 얼마든지 추가가 가능하다.

그룹에 가입하면 데이터를 수신할 수 있다. 

 

TTL : 패킷을 언제 소멸시킬지 패킷의 생명력을 말함. 라우터를 거칠때마다 1씩 감소되며 0이되면 패킷이 소멸된다.

 

그룹 가입

int recv_sock;
struct ip_mreq join_adr;
...
recv_sock=socket(PF_INET, SOCK_DGRAM, 0);
...
join_adr.imr_multiaddr.s_addr = "멀티케스트 그룹의 주소정보":
join_adr.imr_interface.s_addr = "그룹에 가입할 호스트 주소정보":

setsockopt(recv_sock, IPPROTO_IP, Ip_ADD_MEMBERSHIP, (void*)&join_adr, sizeof(join_adr));
...
/////////////////////////
struct ip_mreq{
    struct in_addr imr_multiaddr;
    struct in_addr imr_interface;
}

 

멀티캐스트 센더

send_sock=sock(PF_INET, SOCK_DGRAM, 0);
memset(&mul_adr, 0, sizeof(mul_adr));
mul_adr.sin_family = AF_INET;
mul_adr.sin_addr.s_addr=inet_addr(argv[1]); // 멀티캐스트 IP 지정 (224.0.0.0 ~ 239.255.255.255)
mul_adr.sin_port=htons(atoi(argv[2])); // 멀티캐스트 포트 지정

setsockopt(send_sock, IPPROTO_IP, IP_MULTICAST_TTL, (void*)&time_live, sizeof(time_live)); // TTL세팅
if((fp=fopen("news.txt", "r")) ==NULL)
    error_handling("fopen() error");
    
while(!feof(fp)){
    fgets(buf, BUF_SIZE, fp);
    sendto(send_sock, buf, strlen(buf), 0, (struct sockaddr*)&mul_adr, sizeof(mul_adr));
    sleep(2);
}

 

멀티캐스트 리시버

recv_sock=sock(PF_INET, SOCK_DGRAM, 0);
memset(&adr, 0, sizeof(adr));
adr.sin_family=AF_INET;
adr.sin_addr.s_addr=htonl(INADDR_ANY);
adr.sin_port=htos(atoi(argv[2]));

bind(recv_sock, (struct sockaddr*)&adr, sizeof(adr));

join_adr.imr_multiaddr.s_addr=inet_addr(argv[1]);
join_adr.imr_interface.s_addr=htonl(INADDR_ANY);

setsockopt(recv_sock, IPPROTO_IP, Ip_ADD_MEMBERSHIP, (void*)&join_adr, sizeof(join_adr));
while(1){
    str_len=recvfrom(recv_sock, buf, BUF_SIZE-1, 0, NULL, 0);
    if(str_len<0)
        break;
    buf[str_len]=0;
    fputs(buf, stdout);
}

 

 

브로드캐스트

동일한 네트워크상에 존재하는 모든 호스트에게 데이터를 전송

데이터 전송의 대상이 호스트가 아닌 네트워크이다.

 

해당 네트워크의 호스트주소를 1로 세팅해서 전송하면 해당 네트워크로 데이터가 전송된다(211.218.0.1) 다이렉트브캐

255.255.255.255 로 데이터를 전송하면 자신의 네트워크에 속한 모든 호스트에 전송된다. 로컬 브캐 

 

브로드캐스트를 수행하려면 소켓의 SO_BROADCAST 옵션을 1로 세팅해야한다.

int send_sock;
int bcast=1;
...
send_sock=socket(PF_INET, SOCK_DGRAM, 0);
setsockopt(send_sock, SOL_SOCKET, SO_BROADCAST, (void*)&bcast, sizeof(bcast));
...