0
点赞
收藏
分享

微信扫一扫

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

爱喝酒的幸福人 2022-01-21 阅读 58

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 }
举报

相关推荐

0 条评论