2020년 4월 24일 금요일

UDP 통신에서 MULTICAST이용하기

MFC CAsyncSocket이용하기

CmyAsyncSocket m_UDP;

// 약속된 포트를 연다.  받기 위해서
m_UDP.Create(m_port,SOCK_DGRAM,FD_READ | FD_WRITE);  // SOCK_DGRAM : UDP통신

// 보내기
SOCKADDR_IN saddr;
memset(&saddr,0,sizeof(saddr));
saddr.sin_family = AF_INET;
saddr.sin_addr.s_addr = inet_addr( ipaddress );  // 보낼곳.
saddr.sin_port=htons(m_port);                       // 그 약속된 포트
m_UDP.SendTo(m_msg.GetBuffer(0), 1024, (SOCKADDR*)&saddr, sizeof(saddr));

// 받기
SOCKADDR_IN saddr;
int size=sizeof(saddr);
TCHAR tbuff[1024]={0,};
int nRead = m_UDP.ReceiveFrom(tbuff,1024,(SOCKADDR*)&saddr,&size);

// 다음은 MULTICAST ...
// 옵션을 추가한다... D ipaddress group으로 전송하고자 한다.
// 보내기 위해서  TTL  로 뚫고  IF를 local ip로 지정한다.
int ttl=2;
m_UDP.SetSockOpt(IP_MULTICAST_TTL, (char *)&ttl, sizeof(ttl), IPPROTO_IP) ;
char ipaddr[25]; // local address
WideCharToMultiByte(CP_ACP, 0, m_ip, -1, ipaddr, 25, NULL, NULL);
IN_ADDR localaddr;
localaddr.s_addr = inet_addr( ipaddr );
m_UDP.SetSockOpt(IP_MULTICAST_IF, (char *)&localaddr, sizeof(localaddr), IPPROTO_IP) ;

// 받기 위해서  D ip address group을 등록한다.
char ipaddress[25]={"224.0.0.123"};  //D group ip address 사용. 
struct ip_mreq mreq ;
memset(&mreq, 0, sizeof(mreq)) ;
mreq.imr_multiaddr.s_addr = inet_addr( ipaddress );
mreq.imr_interface.s_addr = htons(m_port); //htonl( INADDR_ANY );
mreq.imr_interface.s_addr = htonl( INADDR_ANY );
m_UDP.SetSockOpt(IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq), IPPROTO_IP) ;

// 옵션 지정후 보내기는 D group ip로 보내야 한다.
saddr.sin_addr.s_addr = inet_addr( "224.0.0.123" );  
m_UDP.SendTo(m_msg.GetBuffer(0), 1024, (SOCKADDR*)&saddr, sizeof(saddr));
// 그러면 Multicast 받기 그룹에 등록된 곳을 받는다.    

댓글 없음: