2008年7月15日 星期二

[Socket] 用Multicast來傳輸資料

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

沒有留言: