UDP 单播、播送和多播ITeye - 牛牛娱乐

UDP 单播、播送和多播ITeye

2019年03月26日08时26分30秒 | 作者: 芷容 | 标签: 多播,播送,单播 | 浏览: 1243

3、多播程序设计的结构

要进行多播的编程,需求遵照必定的编程结构。多播程序结构首要包括套接字初始化、设置多播超时时刻、参加多播组、发送数据、接纳数据以及从多播组中脱离几个方面。其进程如下:

(1)树立一个socket。

(2)然后设置多播的参数,例如超时时刻TTL、本地回环答应LOOP等。

(3)参加多播组。

(4)发送和接纳数据。

(5)从多播组脱离。

4、多播完成代码

服务端代码:

 1 #include iostream 
 2 #include stdio.h 
 3 #include sys/socket.h 
 4 #include netdb.h 
 5 #include sys/types.h 
 6 #include arpa/inet.h 
 7 #include netinet/in.h 
 8 #include unistd.h 
 9 #include stdlib.h 
10 #include string.h 
11 #define MCAST_PORT 8888
12 #define MCAST_ADDR "224.0.0.88" // 多播地址
13 #define MCAST_DATA "BROADCAST TEST DATA" // 多播内容
14 #define MCAST_INTERVAL 5 //多播时刻距离
15 using namespace std;
17 int main()
19 int sock;
20 struct sockaddr_in mcast_addr;
21 sock=socket(AF_INET,SOCK_DGRAM,0);
22 if(sock-1)
24 cout "socket error" endl;
25 return -1;
27 memset( mcast_addr,0,sizeof(mcast_addr));
28 mcast_addr.sin_family=AF_INET;
29 mcast_addr.sin_addr.s_addr=inet_addr(MCAST_ADDR);
30 mcast_addr.sin_port=htons(MCAST_PORT);
31 while(1)
32 { //向部分多播地址发送多播内容
33 int n=sendto(sock,MCAST_DATA,sizeof(MCAST_DATA),0,(struct sockaddr*) mcast_addr,sizeof(mcast_addr));
34 if(n 0)
36 cout "send error" endl;
37 return -2;
39 else
41 cout "send message is going ...." endl;
43 sleep(MCAST_INTERVAL);
46 return 0;
47 }

客户端代码:

 1 #include iostream 
 2 #include stdio.h 
 3 #include stdlib.h 
 4 #include string.h 
 5 #include sys/types.h 
 6 #include unistd.h 
 7 #include sys/socket.h 
 8 #include netdb.h 
 9 #include arpa/inet.h 
10 #include netinet/in.h 
11 #define MCAST_PORT 8888
12 #define MCAST_ADDR "224.0.0.88" /*一个部分衔接多播地址,路由器不进行转发*/
13 #define MCAST_INTERVAL 5 //发送时刻距离
14 #define BUFF_SIZE 256 //接纳缓冲区巨细
15 using namespace std;
16 int main()
18 int sock;
19 struct sockaddr_in local_addr;
20 int err=-1;
21 sock=socket(AF_INET,SOCK_DGRAM,0);
22 if(sock-1)
24 cout "sock error" endl;
25 return -1;
27 /*初始化地址*/
28 local_addr.sin_family=AF_INET;
29 local_addr.sin_addr.s_addr=htonl(INADDR_ANY);
30 local_addr.sin_port=htons(MCAST_PORT);
31 /*绑定socket*/
32 err=bind(sock,(struct sockaddr*) local_addr,sizeof(local_addr));
33 if(err 0)
35 cout "bind error" endl;
36 return -2;
38 /*设置回环答应*/
39 int loop=1;
40 err=setsockopt(sock,IPPROTO_IP,IP_MULTICAST_LOOP, loop,sizeof(loop));
41 if(err 0)
43 cout "set sock error" endl;
44 return -3;
46 struct ip_mreq mreq;/*参加播送组*/
47 mreq.imr_multiaddr.s_addr=inet_addr(MCAST_ADDR);//播送地址
48 mreq.imr_interface.s_addr=htonl(INADDR_ANY); //网络接口为默许
49 /*将本机参加播送组*/
50 err=setsockopt(sock,IPPROTO_IP,IP_ADD_MEMBERSHIP, mreq,sizeof(mreq));
51 if(err 0)
53 cout "set sock error" endl;
54 return -4;
56 int times=0;
57 socklen_t addr_len=0;
58 char buff[BUFF_SIZE];
59 int n=0;
60 /*循环承受播送组的音讯,5次后退出*/
61 for(times=0;;times++)
63 addr_len=sizeof(local_addr);
64 memset(buff,0,BUFF_SIZE);
65 n=recvfrom(sock,buff,BUFF_SIZE,0,(struct sockaddr*) local_addr, addr_len);
66 if(n-1)
68 cout "recv error" endl;
69 return -5;
71 /*打印信息*/
72 printf("RECV %dst message from server : %s\n",times,buff);
73 sleep(MCAST_INTERVAL);
75 /*退出播送组*/
76 err=setsockopt(sock,IPPROTO_IP,IP_DROP_MEMBERSHIP, mreq,sizeof(mreq));
77 close(sock);
78 return 0;
79 }

 关于此处bind函数的解析

bind操作首要查看用户指定的端口是否可用,然后为socket的一些成员设置正确的值,并添加到哈希表myudp_hash中。然后,协议栈每次收到UDP数据,就会查看该数据报的源和意图地址,还有源和意图端口,在myudp_hash中找到匹配的socket,把该数据报放入该 socket的接纳行列,以备用户读取。在这个程序中,bind操作把socket绑定到地址224.0.0.88:8888上, 该操作发生的直接成果便是,关于socket自身,下列值受影响:
    struct inet_sock{
        .rcv_saddr = 224.0.0.88;
        .saddr = 0.0.0.0;
        .sport = 8888;
        .daddr = 0.0.0.0;
        .dport = 0;
    }
    这五个数据表明,该套接字在发送数据包时,本地运用端口8888,本地能够运用恣意一个网络设备接口,发往的意图地址不指定。在接纳数据时,只接纳发往IP地址224.0.0.88的端口为8888的数据。

我的疑问???

为什么要播送方和承受方的端口号相同才干收到播送?我试了在一台linux机子上开两个客户端其间一个和播送方的端口号不同,这个客户端成果收不到播送,哪位网友知道恳请告之。
    程序中,紧接着bind有一个setsockopt操作,它的作用是将socket参加一个组播组,由于socket要接纳组播地址224.0.0.1的数据,它就有必要参加该组播组。

三、UDP播送与单播 播送与单播的比较

播送和单播的处理进程是不同的,单播的数据仅仅收发数据的特定主机进行处理,而播送的数据整个局域网都进行处理。

例如在一个以太网上有3个主机,主机的装备如表11.4所示。

表11.4 某局域网中主机的装备状况

版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表牛牛娱乐立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章

阅读排行

  • 1

    UDP 单播、播送和多播ITeye

    多播,播送,单播
  • 2

    常用数据库操作ITeye

    数据库,数据,字段名
  • 3
  • 4

    一个简略的切开shellITeye

    一个,文件,体系
  • 5

    Mac/Linux 装备环境变量ITeye

    这个,文件,增加
  • 6

    rabbit及redis 装置ITeye

    装置,文件,进入
  • 7
  • 8
  • 9

    netstat指令详解ITeye

    显现,数据,衔接
  • 10

    centos6.5 装备JavaWeb环境ITeye

    装置,这儿,是从