[X]关闭

网络编程_5day_广播

文档创建者:ぉ沙皮狗的忧伤
浏览次数:4152
最后更新:2021-03-17
本帖最后由 ぉ沙皮狗的忧伤 于 2021-3-18 17:01 编辑

一、概念
    数据包的发送方式只有一个接受方成为单播,如果同时发给局域网中的所有主机称为广播,只有用户使用UDP协议才能广播
    广播地址,以172.18.21.1网段为例,最大的主机地址172.18.21.255代表该网段的广播地址
    截图202103171548496526..png

二、send_bt.c代码讲解
1、添加头文件
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <string.h>
  5. #include <strings.h>
  6. #include <arpa/inet.h>
  7. #include <sys/types.h>
  8. #include <sys/socket.h>
  9. #include <netinet/in.h>
  10. #include <netinet/ip.h>
复制代码
2、建立数据报套接字,使用UDP
  1. //建立数据报套接字
  2. //参数1----地址族,网络地址族
  3. //参数2----套接字类型,SOCK_DGRAM使用UDP
  4. //参数3----protocol通常设置为0
  5. //返回值---成功返回socket ID,出错返回-1
  6. serfd = socket( AF_INET, SOCK_DGRAM, 0);
  7. if(serfd < 0){
  8.    perror("socket failed!\n");
  9.    exit(1);
  10. }
复制代码
3、打开广播
  1. int on = 1;
  2. //打开广播
  3. //参数1----socket套接字描述符
  4. //参数2----选项级别,SOL_SOCKET套接字级别上设置选项
  5. //参数3----选项名,SO_BROADCAST开启进程发送广播消息
  6. //参数4----存放选项值得缓冲区地址
  7. //参数5----缓冲区长度
  8. //返回值---成功返回0,失败返回-1
  9. ret = setsockopt( serfd, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on));
  10. if(ret < 0){
  11.     perror("setsockopt failed!\n");
  12.     exit(1);
  13. }
复制代码
4、指定接收方IP,广播地址,端口
  1. //指定接收方IP为广播地址和端口
  2. struct sockaddr_in self;
  3. bzero( &self, sizeof(self));
  4. self.sin_family = AF_INET;                    //选择ipv4协议
  5. self.sin_port = htons(9999);                   //端口
  6. self.sin_addr.s_addr = inet_addr("172.18.21.255");     //广播地址
复制代码
5、从键盘读取数据并发送过去
  1. //写数据
  2. while(1){
  3.     bzero( buf, 128);
  4.     fgets( buf, 128, stdin);
  5.     //发送数据
  6.     //参数1-----套接字
  7.     //参数2-----待发送数据的缓冲区
  8.     //参数3-----缓冲区长度
  9.     //参数4-----调用方式标志位,一般为0,将会改变sendto发送的形式
  10.     //参数5-----指向目的的套接字地址
  11.     //参数6-----指向地址的长度
  12.     //返回值----成功,发送字节数,失败返回SOCKET_ERROR
  13.     ret = sendto( serfd, buf, strlen(buf), 0, (struct sockaddr *)&self, sizeof(self));
  14.     if(ret < 0){
  15.         perror("send failed!\n");
  16.         exit(1);
  17.     }
  18. }
复制代码

三、recv_bt.c代码讲解1、添加头文件
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <string.h>
  5. #include <strings.h>
  6. #include <arpa/inet.h>
  7. #include <sys/types.h>
  8. #include <sys/socket.h>
  9. #include <netinet/in.h>
  10. #include <netinet/ip.h>
复制代码
2、建立数据报套接字
  1. //2、建立数据报套接字
  2. //参数1----地址族,AF_INET网络地址族
  3. //参数2----套接字类型,SOCK_DGRAM使用UDP
  4. //参数3----procotol通常设置为0
  5. //返回值---成功返回socket id,失败返回-1
  6. serfd = socket( AF_INET, SOCK_DGRAM, 0);
复制代码
3、绑定本机IP和指定端口
  1. //绑定本机IP和指定端口
  2. struct sockaddr_in self;
  3. bzero( &self, sizeof(self));
  4. self.sin_family = AF_INET;             //选择ipv4协议
  5. self.sin_port = htons(9999);           //端口
  6. self.sin_addr.s_addr = htonl(INADDR_ANY);   //内核自动绑定本地所有IP
  7.    
  8. ret = bind( serfd, (struct sockaddr *)&self, sizeof(self));
  9. if(ret < 0){
  10.       perror("bind failed!\n");
  11.       exit(1);
  12. }
复制代码
4、读数据
  1. char buf[1024];
  2. struct sockaddr_in cli;
  3. bzero( &cli,sizeof(cli));
  4. int len = sizeof(cli);
  5. //读数据:广播数据和单播数据
  6. while(1){
  7.     bzero( buf, 1024);
  8.     //接收数据
  9.     //参数1-----套接字
  10.     //参数2-----待发送数据的缓冲区
  11.     //参数3-----缓冲区长度
  12.     //参数4-----调用方式标志位,一般为0,将会改变recv接收的形式
  13.     //参数5-----指向目的的套接字地址
  14.     //参数6-----指向地址的长度
  15.     //返回值----成功,接收字节数,失败返回SOCKET_ERROR
  16.     ret = recvfrom( serfd, buf, 1023, 0, (struct sockaddr *)&cli, &len);
  17.     if(ret < 0){
  18.         perror("recvfrom failed!\n");
  19.         exit(1);
  20.     }
  21.     printf("client ip = %s port = %d buf = %s\n", inet_ntoa(cli.sin_addr),\
  22.         ntohs(cli.sin_port), buf);
  23. }
复制代码

四、使用gcc编译send_bt.c在Ubuntu上运行,使用交叉编译工具编译recv_bt.c在板卡上运行 截图202103171638251425..png
测试
截图202103171811554607..png


udp_broadcast.tar.gz

6.99 KB, 下载次数: 172

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则