進行linux下的多播程式設計時,需要關閉防火牆,關閉防火牆的方法如下:
1) 重啟後生效
開啟: chkconfig iptables on
關閉: chkconfig iptables off
2) 即時生效,重啟後失效
開啟: service iptables start
關閉: service iptables stop
伺服器端**:
#include
#include
#include
#include
#include
#include
int main()
struct sockaddr_in address;
memset(&address, 0, sizeof(address));
address.sin_family = af_inet;
address.sin_addr.s_addr = inet_addr("224.0.0.99");//多播組位址
address.sin_port = htons(6789);//多播組埠號
while(1)
struct sockaddr_in sin;
int sin_len = sizeof(sin);
char message[256];
if (recvfrom(sockfd, message, 256, 0, (struct sockaddr *)&sin, &sin_len) == -1)
printf("%s %s/n", inet_ntoa(sin.sin_addr.s_addr), message);
sleep(2);
}exit(0);
}客戶端**:
#include
#include
#include
#include
#include
#include
int main(void)
//udp套接字
int sockfd;
if ((sockfd = socket(af_inet, sock_dgram, 0)) == -1)
struct sockaddr_in sin;
memset(&sin, 0, sizeof(sin));
sin.sin_family = af_inet;
/*不管是繫結本機的ip還是繫結組播位址,效果都是一樣,伺服器端接收資料時
看到的都是本機的ip位址,不會是多播位址。*/
//sin.sin_addr.s_addr = htonl(inaddr_any);//可以繫結本機的所有ip
sin.sin_addr.s_addr = inet_addr("224.0.0.99");//也可以繫結組播位址(要加入的組播位址)
//sin.sin_addr.s_addr = inet_addr("224.0.0.88");//不可以是其他的組播位址!
sin.sin_port = htons(6789);//本機的埠號
//位址復用
const int on = 1;
if (setsockopt(sockfd, sol_socket, so_reuseaddr, &on, sizeof(on)) < 0)
//傳送訊息時也會給自己傳送乙份,是否設定不影響多播的傳送與接收
if (setsockopt(sockfd, ipproto_ip, ip_multicast_loop, &on, sizeof(on)) < 0)
//套接字繫結,注意套接字的埠號是6789
if (bind(sockfd, (struct sockaddr *)&sin, sizeof(sin)) < 0)
//需要把本機的哪個ip新增到多播組
struct ip_mreq command;
command.imr_multiaddr.s_addr = inet_addr(host_name);//多播組位址
command.imr_inte***ce.s_addr = htonl(inaddr_any);//本機的所有位址
//command.imr_inte***ce.s_addr = inet_addr("224.0.0.99");//不能使用組播位址,否則加入多播組會出錯!
if (-1 == command.imr_multiaddr.s_addr)
//加入多播組224.0.0.99
if (setsockopt(sockfd, ipproto_ip, ip_add_membership, &command, sizeof(command)) < 0)
int iter = 0;
int sin_len;
char message[256];
while(iter++ < 8)
printf("response #%-2d from server: %s/n", iter, message);
char buf = "bye";
if (sendto(sockfd, buf, sizeof(buf), 0, (struct sockaddr *)&sin, sin_len) == -1)
sleep(2);
}//退出多播組224.0.0.99
if (setsockopt(sockfd, ipproto_ip, ip_drop_membership,&command, sizeof(command)) < 0)
close(sockfd);//關閉套接字
exit(1);
}
linux下多播技術的使用
例如本地計算機的的ip位址是 127.0.0.1二它的多播位址是 224.0.0.1。這是由rcf 1390定義的。為傳送ip多播資料,傳送者需要確定乙個合適的多播位址,這個位址代表乙個組。ipv4多播位址採用d類ip位址確定多播的組。在 internet中,多播位址範圍是從224.0.0.0到23...
多播和組播
1.多播 多播 也可以稱為 組播 這樣的多播應用tcp 2.廣播 廣播 在網路中的應用較多,如客戶機通過dhcp自動獲得ip位址的過程就是通過廣播來實現的。但是同單播和多播相比,廣播幾乎占用了子網內網路的所有頻寬。拿開會打乙個比方吧,在會場上只能有乙個人發言,想象一下如果所有的人同時都用麥克風發言,...
winsock 多播(組播)
組播,就是有一組主機,乙個主機傳送資料,組內其他的主機都會收到。首先,根據上圖講述組播的原理 我們把路由器192.168.0.1埠也看做一台主機,這樣就有四台主機連線到交換機上。根據乙太網的原理,交換機不知道ip位址的存在,只知道mac位址。交換機會根據資料中的目的mac位址把資料報 到某個埠上,保...