Transmitting and Receiving to and from a Multicast IP Group

Transmitting and Receiving to and from a Multicast IP Group

Transmitting to a Multicast IP Group Address

Transmitting to an IP multicast group is identical to transmitting to a unicast or broadcast address. However, when using only IPv4, the stack must be configured to enable multicast transmit, see Multicast Configuration.

Receiving from a Multicast IP Group

An IP multicast group must be joined before packets can be received from it from it (see Joining and Leaving a Multicast Group for more information). Once this is done, receiving from a multicast group only requires a socket bound to the NET_SOCK_ADDR_IP_WILDCARD address, as shown in the following example:

NET_SOCK_ID       sock;
NET_SOCK_ADDR_IP  sock_addr_ip;
NET_SOCK_ADDR     addr_remote;
NET_SOCK_ADDR_LEN addr_remote_len;
CPU_CHAR          rx_buf[100];
CPU_INT16U        rx_len;
NET_ERR           err;
 
 
sock = NetSock_Open((NET_SOCK_PROTOCOL_FAMILY) NET_SOCK_ADDR_FAMILY_IP_V4,
                    (NET_SOCK_TYPE           ) NET_SOCK_TYPE_DATAGRAM,
                    (NET_SOCK_PROTOCOL       ) NET_SOCK_PROTOCOL_UDP,
                    (NET_ERR                *)&err);
if (err != NET_SOCK_ERR_NONE) {
  /* Handle error. */
}
Mem_Set(&sock_addr_ip, (CPU_CHAR)0, sizeof(sock_addr_ip));
sock_addr_ip.AddrFamily = NET_SOCK_ADDR_FAMILY_IP_V4;
sock_addr_ip.Addr       = NET_UTIL_HOST_TO_NET_32(NET_SOCK_ADDR_IP_WILDCARD);
sock_addr_ip.Port       = NET_UTIL_HOST_TO_NET_16(10000);
NetSock_Bind((NET_SOCK_ID      ) sock,
             (NET_SOCK_ADDR   *)&sock_addr_ip,
             (NET_SOCK_ADDR_LEN) NET_SOCK_ADDR_SIZE,
             (NET_ERR         *)&err);
if (err != NET_SOCK_ERR_NONE) {
  /* Handle error. */
}
 
rx_len = NetSock_RxDataFrom((NET_SOCK_ID        ) sock,
                            (void              *)&rx_buf [0],
                            (CPU_INT16U         ) BUF_SIZE,
                            (CPU_INT16S         ) NET_SOCK_FLAG_NONE,
                            (NET_SOCK_ADDR     *)&addr_remote,
                            (NET_SOCK_ADDR_LEN *)&addr_remote_len,
                            (void              *) 0,
                            (CPU_INT08U         ) 0,
                            (CPU_INT08U        *) 0,
                            (NET_ERR           *)&err);