UDP的广播与组播代码实现+解析
一、UDP广播
1.
2.代码实现
服务器
#include<stdio.h>
2 #include<unistd.h>
3 #include<stdlib.h>
4 #include<sys/socket.h>
5 #include<string.h>
6 #include<arpa/inet.h>
7 #include<net/if.h>
8
9 #define SERVER_PORT 8000
10 #define CLIENT_PORT 9000
11 #define MAXLINE 4096
12
13 #define BROADCAST_IP "192.168.99.255"
14
15 int main(void)
16 {
17 int server_sockfd;
18 struct sockaddr_in serveraddr , clientaddr;
19 char buf[MAXLINE];
20
21 //构造用于UDP通信的套接字
22 server_sockfd = socket(AF_INET , SOCK_DGRAM , 0);
23
24 bzero(&serveraddr , sizeof(serveraddr));
25 serveraddr.sin_family = AF_INET;
26 serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);
27 serveraddr.sin_port = htons(SERVER_PORT);
28 bind(server_sockfd,(struct sockaddr *)&serveraddr , sizeof(serveradd r));
29 int flag = 1;
30 setsockopt(server_sockfd , SOL_SOCKET , SO_BROADCAST , &flag , sizeo f(flag) );
31
32 //构造client地址 IP+端口号 192.168.X.255+9000
33 bzero(&clientaddr , sizeof(clientaddr));
34 clientaddr.sin_family = AF_INET;
35 inet_pton(AF_INET , BROADCAST_IP , &clientaddr.sin_addr.s_addr);
36 clientaddr.sin_port = htons(CLIENT_PORT);
37
38 int i=0;
39 while(1){
40 sprintf(buf , "Drink %d glasses of water\n", i++);
41 sendto(server_sockfd , buf , strlen(buf) , 0 , (struct socka ddr *)&clientaddr , sizeof(clientaddr));
42 printf("%s",buf);
43 sleep(1);
44
45 }
46
47 close(server_sockfd);
48 return 0;
49
50 }
客户端
1 #include<stdio.h>
2 #include<unistd.h>
3 #include<string.h>
4 #include<sys/socket.h>
5 #include<arpa/inet.h>
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 localaddr.sin_family = AF_INET;
24 inet_pton(AF_INET , "0.0.0.0" , &localaddr.sin_addr.s_addr);
25 localaddr.sin_port = htons(CLIENT_PORT);
26
27 int ret = bind(confd , (struct sockaddr *)&localaddr , sizeof(locala ddr));
28 if(ret == 0)
29 printf("...bind ok...\n");
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.
2.代码实现
服务器
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <unistd.h>
4 #include <string.h>
5 #include <arpa/inet.h>
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 cliaddr.sin_family = AF_INET;
27 cliaddr.sin_port = htons(8000); // 客户端也需要绑定这端口
28 inet_pton(AF_INET, "239.0.0.10", &cliaddr.sin_addr.s_addr);
29
30 int num = 0;
31 // 3. 通信
32 while(1)
33 {
34 // 接收数据
35 char buf[128];
36 // 发送数据
37 sprintf(buf, "hello, client...%d\n ", num++);
38 sendto(fd, buf, strlen(buf)+1, 0, (struct sockaddr*)&cliaddr, sizeof (cliaddr));
39 printf("组播的数据: %s\n", buf);
40 sleep(1);
41 }
42 close(fd);
43 return 0;
44 }
客户端
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <unistd.h>
4 #include <string.h>
5 #include <arpa/inet.h>
6 #include <net/if.h>
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 addr.sin_family = AF_INET;
21 addr.sin_port = htons(8000);
22 addr.sin_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.sin_addr.s_addr);
30 // 加入到组播
31 struct ip_mreqn op;
32 op.imr_address.s_addr = INADDR_ANY; // 本地地址
33 inet_pton(AF_INET, "239.0.0.10", &op.imr_multiaddr.s_addr);
34 op.imr_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: %s\n", buf);
44 }
45 close(fd);
46 return 0;
47 }