UDP广播代码案例(测试自测)

广播的发送与接收通过UDP套接字来实现的。广播包发送的流程如下:
(1)创建UDP套接字。
(2)指定目标地址和端口(填充广播信息结构体)。
(3)设置套接字选项允许发送广播包。
(4)发送广播消息。
发送广播包的示例代码如下所示。通过setsockopt()设置网络属性,允许进行广播。

 1 #include <stdio.h>
  2 #include <arpa/inet.h>
  3 #include <sys/types.h>
  4 #include <sys/socket.h>
  5 #include <netinet/in.h>
  6 #include <stdlib.h>
  7 #include <unistd.h>
  8 #include <string.h>
  9 
 10 #define N 128
 11 #define errlog(errmsg) do{perror(errmsg);\      
 12                           printf("%s--%s--%d\n",\ 
 13                                   __FILE__, __func__, __LINE__);\
 14                           exit(1);\
 15                          }while(0)
 16 
 17 int main(int argc, const char *argv[])
 18 {
 19     int sockfd;
 20     struct sockaddr_in broadcastaddr; 
 21     socklen_t addrlen = sizeof(broadcastaddr);  
 22     char buf[N] = {};
 23 
 24     if(argc < 3)                                
 25     {
 26         fprintf(stderr, "Usage: %s ip port\n", argv[0]);     
 27         exit(1);
 28     }
 29 
 30     //第一步:创建套接字
 31     if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)    
 32     {
 33         errlog("fail to socket");
 34     }
 35
 36     //第二步:填充广播网络信息结构体
 37     //inet_addr:将点分十进制ip地址转化为网络字节序的整型数据
 38     //htons:将主机字节序转化为网络字节序
 39     //atoi:将数字型字符串转化为整型数据
 40     broadcastaddr.sin_family = AF_INET;
 41     broadcastaddr.sin_addr.s_addr = inet_addr(argv[1]);
 42     broadcastaddr.sin_port = htons(atoi(argv[2]));
 43 
 44     //第三步:设置为允许发送广播权限
 45     int on = 1;                                                                                                                                                                      
 46     if(setsockopt(sockfd, SOL_SOCKET,\
 47                 SO_BROADCAST, &on, sizeof(on)) < 0)
 48     {
 49         errlog("fail to setsockopt");
 50     }
 51 
 52     while(1)
 53     {
 54         fgets(buf, N, stdin);
 55         buf[strlen(buf) - 1] = '\0';
 56 
 57         if(sendto(sockfd, buf, N, 0,\
 58                     (struct sockaddr *)&broadcastaddr, addrlen) < 0)
 59         {
 60             errlog("fail to sendto");
 61         }
 62 
 63     }
 64 
 65     close(sockfd);
 66 
 67     return 0;
 68 }

广播包接收的流程如下。
(1)创建UDP套接字。
(2)填充广播信息结构体(指定地址和端口)。
(3)绑定信息信息结构体。
(4)接收广播信息。
接收广播包的示例代码如下。

  1 #include <stdio.h>
  2 #include <arpa/inet.h>
  3 #include <sys/types.h>
  4 #include <sys/socket.h>
  5 #include <netinet/in.h>
  6 #include <stdlib.h>
  7 #include <unistd.h>
  8 #include <string.h>
  9 
 10 #define N 128
 11 #define errlog(errmsg) do{perror(errmsg);\
 12                           printf("%s--%s--%d\n",\
 13                                   __FILE__, __func__, __LINE__);\
 14                           exit(1);\
 15                          }while(0)
 16 
 17 int main(int argc, const char *argv[])
 18 {
 19     int sockfd;
 20     struct sockaddr_in broadcastaddr, addr;
 21     socklen_t addrlen = sizeof(broadcastaddr);
 22     char buf[N] = {};
 23 
 24     if(argc < 3)
 25     {
 26         fprintf(stderr, "Usage: %s ip port\n", argv[0]);
 27         exit(1);
 28     }
 29 
 30     //第一步:创建套接字
 31     if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
 32     {
 33         errlog("fail to socket");
 34     }
 35
 36     //第二步:填充广播网络信息结构体
 37     //inet_addr:将点分十进制ip地址转化为网络字节序的整型数据
 38     //htons:将主机字节序转化为网络字节序
 39     //atoi:将数字型字符串转化为整型数据
 40     broadcastaddr.sin_family = AF_INET;
 41     broadcastaddr.sin_addr.s_addr = inet_addr(argv[1]);
 42     broadcastaddr.sin_port = htons(atoi(argv[2]));
 43 
 44     //第三步:将套接字与服务器网络信息结构体绑定
 45     if(bind(sockfd, (struct sockaddr *)&broadcastaddr, addrlen) < 0)
 46     {
 47         errlog("fail to bind");
 48     }
 49 
 50     ssize_t bytes;
 51     while(1)
 52     {
 53         if((bytes = recvfrom(sockfd, buf, N, 0,\                                                                                                                                     
 54                         (struct sockaddr *)&addr, &addrlen)) < 0)
 55         {
 56             errlog("fail to recvfrom");
 57         }
 58         else
 59         {
 60             printf("ip: %s, port: %d\n",\
 61                     inet_ntoa(addr.sin_addr),\ 
 62                     ntohs(addr.sin_port));
 63 
 64             printf("broadcast : %s\n", buf);
 65 
 66         }
 67     }
 68
 69     close(sockfd);
 70 
 71     return 0;
 72 }          

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值