unicast, multicast, broadcast 介紹三種的網路傳輸方式。
其中 Multicast 是用廣播的方式,將資料傳送給所有加入群組的 ip。
IP區段為:224.0.0.0 ~ 239.255.255.255
下面介紹如何設定傳送和接收 Multicast的 Socket。
標頭檔:
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <errno.h>
#include <err.h>
#define PORT 6000
#define GROUP_IP "224.0.0.1"
1. 首先產生一個socket,設定為datagram
sock = socket(AF_INET, SOCK_DGRAM, 0);
2. 設定sockaddr
struct sockaddr_in addr;
bzero(&addr, sizeof(struct sockaddr_in));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr(GROUP_IP); //傳送要設定傳送的multicast ip
//接收則是要將ip設定成INADDR_ANY
//透過bind來接收multicast資料
addr.sin_port = htons(PORT);
3. 接收設定資料要進行bind和設定multicast addr
addr.sin_addr.s_addr = inet_addr(INADDR_ANY);
//bind
if (bind(sock, (struct sockaddr *) &addr, sizeof(struct sockaddr_in)) < 0)
{
perror("bind");
exit(1);
}
mreq.imr_multiaddr.s_addr = inet_addr(GROUP_IP);
mreq.imr_interface.s_addr = htonl(INADDR_ANY);
if (setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(struct ip_mreq)) < 0)
{
perror("setsockopt mreq:");
printf("%d %s\n", errno, strerror(errno));
exit(1);
}
4. 傳送和接收
傳送:
sendto(sock, buf, bufLen, 0, (struct sockaddr *)&addr, sizeof(struct sockaddr));
接收:
u_int addrLen = sizeof(struct sockaddr);
recvfrom(sock, buf, bufLen, 0, (struct sockaddr *)&addr, &addrLen);
參考資料 :
unicast, multicast, broadcast - http://www.hoyo.idv.tw/hoyoweb/document/view.php?sid=109&author=hoyo&status=view