UDP的广播与组播代码实现+解析

UDP的广播与组播代码实现+解析

2023年7月15日发(作者:)

UDP的⼴播与组播代码实现+解析UDP的⼴播与组播代码实现+解析⼀、UDP⼴播1.流程图说明:服务器发送数据报的时候源ip地址为⼴播地址,交换机解析到⼴播地址后发送到⼦⽹的所有主机的9000端⼝。2.直接⼴播与受限⼴播直接⼴播:直接⼴播地址包含⼀个有效的⽹络号和⼀个全“1”的主机号,如你说的202.163.30.255,255就是⼀个主机号,202则是C类的IP地址,C类IP地址就是我们常接触到的。 可⽤于本地⽹络,也可以跨⽹段⼴播。受限⼴播:可以⽤在计算机不知道⾃⼰IP地址的时候,⽐如向DHCP服务器索要地址时、PPPOE拨号时等。路由器不允许它通过。3.代码实现3.1代码说明1. 接收⽅⼀定要知道⼴播⽅的端⼝号,然后绑定此端⼝号才能正确接收。2. 接收⽅的Socket不需要设置成⼴播属性。3. 绑定的IP不可以使⽤“127.0.0.1”,可以使⽤真实IP地址或者INADDR_ANY。否则接收失败。3.2服务器代码 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8

9 #define CLIENT_PORT 9000 10 #define MAXLINE 4096 11

12 #define BROADCAST_IP "192.168.99.255" 13

14 int main(void) 15 { 16 int server_sockfd; 17 struct sockaddr_in serveraddr , clientaddr; 18 char buf[MAXLINE]; 19

20 //构造⽤于UDP通信的套接字 21 server_sockfd = socket(AF_INET , SOCK_DGRAM , 0); 22

23 int flag = 1; 24 setsockopt(server_sockfd , SOL_SOCKET , SO_BROADCAST , &flag , sizeof(flag) ); 25

26 //构造client地址 IP+端⼝号 192.168.X.255+9000 27 bzero(&clientaddr , sizeof(clientaddr)); 28 _family = AF_INET; 29 inet_pton(AF_INET , BROADCAST_IP , &_addr.s_addr); 30 _port = htons(CLIENT_PORT); 31

32 int i=0; 33 while(1){ 34 sprintf(buf , "Drink %d glasses of watern", i++); 35 sendto(server_sockfd , buf , strlen(buf) , 0 , (struct sockaddr *)&clientaddr , sizeof(clientaddr)); 36 printf("%s",buf); 37 sleep(1); 38

39 } 40

41 close(server_sockfd); 42 return 0; 43

44 }3.3客户端 1 #include 2 #include 3 #include 4 #include 5 #include 6

7 #define SERVER_PORT 8000 8 #define MAXLINE 4096 9 #define CLIENT_PORT 9000 10

11 int main(void) 12 { 13 struct sockaddr_in localaddr; 14 int confd; 15 ssize_t len; 16 char buf[MAXLINE]; 17

18 //1.创建⼀个socket 19 confd = socket(AF_INET , SOCK_DGRAM , 0); 20

21 //2.初始化本地端地址--IP地址本地,端⼝号9000 22 bzero(&localaddr , sizeof(localaddr)); 23 _family = AF_INET; 24 inet_pton(AF_INET , "0.0.0.0" , &_addr.s_addr); 25 _port = htons(CLIENT_PORT); 26

27 int ret = bind(confd , (struct sockaddr *)&localaddr , sizeof(locala ddr)); 28 if(ret == 0) 29 printf("..."); 30 while(1){ 31 len = recvfrom(confd , buf , sizeof(buf),0,NULL,0); 32 printf("%s",buf); 33

34 } 35

36 close(confd); 37 return 0; 38 }⼆、UDP组播1.基础知识1. 组播报⽂的⽬的地址使⽤D类IP地址, D类地址不能出现在IP报⽂的源IP地址字段。2. 在ip组播环中,数据包的⽬的地址不是⼀个,⽽是⼀组,形成组地址。所有的信息接收者都加⼊到⼀个组内,并且⼀旦加⼊之后,流向组地址的数据⽴即开始向接收者传输,组中的所有成员都能接收到数据包。组播组中的成员是动态的,主机可以在任何时刻加⼊和离开组播组。3. ⼀个多播组的成员是随时变动的,⼀台主机可以随时加⼊或离开多播组,多播组成员的数⽬和所在的地理位置也不受限制,⼀台主机也可以属于⼏个多播组。此外,不属于某⼀个多播组的主机也可以向该多播组发送数据包。4. 多播作为⼀点对多点的通信,数据的收发仅仅在同⼀分组中进⾏,是节省⽹络带宽的有效⽅法之⼀2.代码实现服务器1 #include 2 #include 3 #include 4 #include 5 #include 6

7 int main() 8 { 9 // 1.

创建通信的套接字 10 int fd = socket(AF_INET, SOCK_DGRAM, 0); 11 if(fd == -1) 12 { 13 perror("socket"); 14 exit(0); 15 } 16

17 //

设置组播属性 18 struct in_addr imr_multiaddr; 19 //

初始化组播地址 20 inet_pton(AF_INET, "239.0.0.10", &imr_multiaddr.s_addr); 21 setsockopt(fd, IPPROTO_IP, IP_MULTICAST_IF, &imr_multiaddr, sizeof(imr_m ultiaddr)); 22

23 //

将数据发送给客户端,

使⽤⼴播地址和固定端⼝ 24 //

初始化客户端的地址信息 25 struct sockaddr_in cliaddr; 26 _family = AF_INET; 27 _port = htons(8000); //

客户端也需要绑定这端⼝ 28 inet_pton(AF_INET, "239.0.0.10", &_addr.s_addr); 29

30 int num = 0; 31 // 3.

通信 32 while(1) 33 { 34 //

接收数据 35 char buf[128]; 36 //

发送数据 37 sprintf(buf, "hello, %dn ", num++); 38 sendto(fd, buf, strlen(buf)+1, 0, (struct sockaddr*)&cliaddr, sizeof (cliaddr)); 39 printf("组播的数据: %sn", buf); 40 sleep(1); 41 } 42 close(fd); 43 return 0; 44 }客户端 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7

8 int main() 9 { 10 // 1.

创建通信的套接字 11 int fd = socket(AF_INET, SOCK_DGRAM, 0); 12 if(fd == -1) 13 { 14 perror("socket"); 15 exit(0); 16 } 17

18 // 2.

通信的fd绑定本地的IP和端⼝ 19 struct sockaddr_in addr; 20 _family = AF_INET; 21 _port = htons(8000); 22 _addr.s_addr = INADDR_ANY; 23 int ret = bind(fd, (struct sockaddr*)&addr, sizeof(addr)); 24 if(ret == -1) 25 { 26 perror("bind"); 27 exit(0); 28 } 29 //inet_pton(AF_INET, "0.0.0.0", &_addr.s_addr); 30 //

加⼊到组播 31 struct ip_mreqn op; 32 _address.s_addr = INADDR_ANY; //

本地地址 33 inet_pton(AF_INET, "239.0.0.10", &_multiaddr.s_addr); 34 _ifindex = if_nametoindex("ens33"); 35

36 setsockopt(fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &op, sizeof(op)); 37 // 3.

通信 38 while(1) 39 { 40 //

接收数据 41 char buf[128]; 42 recvfrom(fd, buf, sizeof(buf), 0, NULL, NULL); 43 printf("server say: %sn", buf); 44 } 45 close(fd); 46 return 0; 47 }

发布者:admin,转转请注明出处:http://www.yc00.com/news/1689408804a243341.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信