UDP广播通信

单播:一对一,TCP和UDP均可完成

广播:只能UDP完成。广播时发送方只发送一个数据包,但是网络上的交换机默认转发广播数据包到所有端口。路由器默认不转发任何广播数据包。故广播在局域网范围内。

组播:只有UDP可以完成。发送消息到同一个组播组的主机。视频电话、视频会议多采用。

广播IP地址:主机号全1。网络号正常

广播MAC地址:全1,即FF:FF:FF:FF:FF:FF

广播数据帧格式

处理过程:

网卡驱动程序对比自己的MAC地址与目的MAC地址,发现是广播MAC地址,统一接收并交给OS(IP层)。

IP层判断IP地址与自己是否一致。发现为IP地址为当前网段的广播地址,交给传输层

传输层根据端口,如果有对应的端口交给应用程序处理。否则丢弃数据包。

不管主机是否有进程接收广播消息,广播消息一定会被网卡收到并交个操作系统处理。会造成网络主机负担。

设置socket可以发送广播消息

int yes = 1;
setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &yes, sizeof(yes));

接收端绑定地址信息时,需要制定接收任意地址信息的数据包。

例子:

发送端广播一段信息,接收端接收。

注意:setsockopt为广播的目的应该是告知MAC地址为FF:FF:FF:FF:FF:FF 而广播的IP地址需要我们自己写上。即(网络号:全1主机号)。通过ifconfig获取。

发送端

#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<string.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<netinet/tcp.h>
#include<sys/socket.h>
#include<sys/wait.h>
#include<unistd.h>
#include<arpa/inet.h>
#include<sys/time.h>int main(int argc, char **argv)
{struct sockaddr_in s_addr;int sock;int addr_len;int len;char buff[128];int yes;//UDP 创建socketif((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1){perror("socket");exit(EXIT_FAILURE);}else{printf("create socket.\n\r");}//设置socket为可发送广播消息yes = 1;setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &yes, sizeof(yes));s_addr.sin_family = AF_INET;s_addr.sin_port = htons(7838);if(argv[1]){s_addr.sin_addr.s_addr = inet_addr(argv[1]); //参数1 广播地址
    }    else{printf("input sever ip!\n");exit(0);}addr_len = sizeof(s_addr);strcpy(buff, "hello message");//发送消息len = sendto(sock, buff, strlen(buff), 0, (struct sockaddr *)&s_addr, addr_len);if(len < 0){printf("\n\rsend error.\n\r");exit(EXIT_FAILURE);}printf("send success.\n\r");return 0;
}

接收端

#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<string.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<netinet/tcp.h>
#include<sys/socket.h>
#include<sys/wait.h>
#include<unistd.h>
#include<arpa/inet.h>
#include<sys/time.h>int main(int argc, char **argv)
{struct sockaddr_in s_addr;struct sockaddr_in c_addr;int sock;socklen_t addr_len;int len;char buff[128];//创建socket UDPif((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1){perror("socket");exit(EXIT_FAILURE);}else{printf("create socket.\n\r");}memset(&s_addr, 0, sizeof(struct sockaddr_in));s_addr.sin_family = AF_INET;s_addr.sin_port = htons(7838);s_addr.sin_addr.s_addr = INADDR_ANY;//绑定IP地址if((bind(sock, (struct sockaddr *)&s_addr, sizeof(s_addr))) == -1){perror("bind");exit(EXIT_FAILURE);}else{printf("bind address to socket.\n\r");}addr_len = sizeof(c_addr);while(1){//阻塞方式接收数据len = recvfrom(sock, buff, sizeof(buff) - 1, 0, (struct sockaddr *)&c_addr, &addr_len);if(len < 0){perror("recvfrom");exit(EXIT_FAILURE);}buff[len] = '\0';printf("recive come from %s:%d message:%s\n\r", inet_ntoa(c_addr.sin_addr), ntohs(c_addr.sin_port), buff);}return 0;
}

【linux高级程序设计】(第十五章)UDP网络编程应用 2相关推荐

  1. linux键盘设置的文件在哪个文件夹,「正点原子Linux连载」第十五章按键输入试验...

    原标题:「正点原子Linux连载」第十五章按键输入试验 第十五章按键输入试验 前面几章试验都是讲解如何使用I.MX6U的GPIO输出控制功能,I.MX6U的IO不仅能作为输出,而且也可以作为输入.I. ...

  2. 【十五】Java网络编程思维导图

    知识章节参考:[十五]Java网络编程

  3. 【正点原子Linux连载】第十五章点亮LED-摘自【正点原子】I.MX6U嵌入式Linux C应用编程指南V1.1

    1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...

  4. 《Kotlin 程序设计》第五章 Kotlin 面向对象编程(OOP)

    第五章 Kotlin 面向对象编程(OOP) 正式上架:<Kotlin极简教程>Official on shelves: Kotlin Programming minimalist tut ...

  5. 《javascript高级程序设计》第五章知识点总结

    第五章知识点总结 1.object类型 访问对象的方法:①点表示法        (people.name) :      ②方括号表示法         (people[name]). 常用方法:h ...

  6. Kotlin第五章: android网络编程

    1. Android网络编程 OkHttp OkHttp是一个高效的HTTP客户端,它的横空出世,让其他的网络请求框架都变得黯然失色. Retrofit Retrofit是一个基于OkHttp的RES ...

  7. 【linux高级程序设计】(第九章)进程间通信-管道 3

    有名管道 无名管道和有名管道: 1. 管道是特殊类型的文件,在满足先入先出的原则写可以读写,不能定位读写位置. 2.管道是单向的. 3.无名管道阻塞于读写位置,而有名管道阻塞在创建位置. 4.无名管道 ...

  8. mysal向一个无法连接的网络尝试了一个套接字操作 0.0.3.235_第十二章 Java网络编程(3)——套接字(上)...

    套接字 套接字概述 网络通信使用IP地址标识Internet上的计算机,使用端口号标识服务器上的进程(程序).也就是说,如果服务器上的一个程序不占用一个端口号,用户程序就无法找到它,就无法和该程序交互 ...

  9. java听课笔记(十五)之 网络编程

    网络编程 网路应用的结构 TCP编程 TCP是一个有连接,可靠的协议 java.net.Socket java.net.ServerSocket 核心思路 开发服务器端 ServerSocket ss ...

  10. 第十六章 ConvNeXt网络详解

    系列文章目录 第一章 AlexNet网络详解 第二章 VGG网络详解 第三章 GoogLeNet网络详解 第四章 ResNet网络详解 第五章 ResNeXt网络详解 第六章 MobileNetv1网 ...

最新文章

  1. fpga实战训练精粹pdf_tensorflow版PSENet 文本检测模型训练和测试
  2. Linux系统开机启动过程分析
  3. TCP的TIME_WAIT状态
  4. [js] 写一个获取页面中所有checkbox的方法
  5. 将GDB中的输出定向到文件
  6. 【报告分享】2020新零售直播活力报告.pdf(附下载链接)
  7. 程序员接私活的几个平台
  8. spyder selenium配置
  9. 【keil/MDK5】编译生成bin文件和汇编文件
  10. WD西部数据移动硬盘官方真伪查询
  11. USBCAN卡解决新能源汽车CAN总线测试问题
  12. bmc linux 默认密码_系统下重置BMC密码方法
  13. 一次成功——奶香提子酥
  14. Coodeforces 585D Lizard Era: Beginning (折半搜索)
  15. C语言readdir()函数:读取目录函数
  16. VS2019菜单栏的项目、生成、格式三个菜单栏不见了
  17. 解决 SQL事务回退中 从未在此会话中创建保存点 ‘S1‘ 或者该保存点无效
  18. 诊断(UDS)协议栈设计-总体架构设计
  19. PDF文件怎么转换为图片?
  20. Jetson nano 上使用ROS进行双目摄像头(CSI-IMX219)操作标定

热门文章

  1. 感觉皮层实质性参与工作记忆的信息保存
  2. 起底软银帝国:芯片、机器人、棒球队无所不投
  3. BCG、阿里、百度联合发布中国互联网经济白皮书2.0,解读“中国互联网新篇章:迈向产业融合”...
  4. 《全球人工智能产业地图》发布(附PPT图片)
  5. Michael I. Jordan——计算思维、推断思维与数据科学
  6. 密码学+赛博朋克,关于密码朋克们的奇妙故事
  7. 脉脉成为互联网大厂公敌
  8. 让图片动起来,特朗普和蒙娜丽莎深情合唱《Unravel》
  9. python 网页cookie的使用
  10. 深入学习QWidget-1