linux下的多播

2021-05-12 09:53:39 字數 2781 閱讀 5091

進行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位址把資料報 到某個埠上,保...