【linux高级程序设计】(第十五章)UDP网络编程应用 2
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相关推荐
- linux键盘设置的文件在哪个文件夹,「正点原子Linux连载」第十五章按键输入试验...
原标题:「正点原子Linux连载」第十五章按键输入试验 第十五章按键输入试验 前面几章试验都是讲解如何使用I.MX6U的GPIO输出控制功能,I.MX6U的IO不仅能作为输出,而且也可以作为输入.I. ...
- 【十五】Java网络编程思维导图
知识章节参考:[十五]Java网络编程
- 【正点原子Linux连载】第十五章点亮LED-摘自【正点原子】I.MX6U嵌入式Linux C应用编程指南V1.1
1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...
- 《Kotlin 程序设计》第五章 Kotlin 面向对象编程(OOP)
第五章 Kotlin 面向对象编程(OOP) 正式上架:<Kotlin极简教程>Official on shelves: Kotlin Programming minimalist tut ...
- 《javascript高级程序设计》第五章知识点总结
第五章知识点总结 1.object类型 访问对象的方法:①点表示法 (people.name) : ②方括号表示法 (people[name]). 常用方法:h ...
- Kotlin第五章: android网络编程
1. Android网络编程 OkHttp OkHttp是一个高效的HTTP客户端,它的横空出世,让其他的网络请求框架都变得黯然失色. Retrofit Retrofit是一个基于OkHttp的RES ...
- 【linux高级程序设计】(第九章)进程间通信-管道 3
有名管道 无名管道和有名管道: 1. 管道是特殊类型的文件,在满足先入先出的原则写可以读写,不能定位读写位置. 2.管道是单向的. 3.无名管道阻塞于读写位置,而有名管道阻塞在创建位置. 4.无名管道 ...
- mysal向一个无法连接的网络尝试了一个套接字操作 0.0.3.235_第十二章 Java网络编程(3)——套接字(上)...
套接字 套接字概述 网络通信使用IP地址标识Internet上的计算机,使用端口号标识服务器上的进程(程序).也就是说,如果服务器上的一个程序不占用一个端口号,用户程序就无法找到它,就无法和该程序交互 ...
- java听课笔记(十五)之 网络编程
网络编程 网路应用的结构 TCP编程 TCP是一个有连接,可靠的协议 java.net.Socket java.net.ServerSocket 核心思路 开发服务器端 ServerSocket ss ...
- 第十六章 ConvNeXt网络详解
系列文章目录 第一章 AlexNet网络详解 第二章 VGG网络详解 第三章 GoogLeNet网络详解 第四章 ResNet网络详解 第五章 ResNeXt网络详解 第六章 MobileNetv1网 ...
最新文章
- fpga实战训练精粹pdf_tensorflow版PSENet 文本检测模型训练和测试
- Linux系统开机启动过程分析
- TCP的TIME_WAIT状态
- [js] 写一个获取页面中所有checkbox的方法
- 将GDB中的输出定向到文件
- 【报告分享】2020新零售直播活力报告.pdf(附下载链接)
- 程序员接私活的几个平台
- spyder selenium配置
- 【keil/MDK5】编译生成bin文件和汇编文件
- WD西部数据移动硬盘官方真伪查询
- USBCAN卡解决新能源汽车CAN总线测试问题
- bmc linux 默认密码_系统下重置BMC密码方法
- 一次成功——奶香提子酥
- Coodeforces 585D Lizard Era: Beginning (折半搜索)
- C语言readdir()函数:读取目录函数
- VS2019菜单栏的项目、生成、格式三个菜单栏不见了
- 解决 SQL事务回退中 从未在此会话中创建保存点 ‘S1‘ 或者该保存点无效
- 诊断(UDS)协议栈设计-总体架构设计
- PDF文件怎么转换为图片?
- Jetson nano 上使用ROS进行双目摄像头(CSI-IMX219)操作标定
热门文章
- 感觉皮层实质性参与工作记忆的信息保存
- 起底软银帝国:芯片、机器人、棒球队无所不投
- BCG、阿里、百度联合发布中国互联网经济白皮书2.0,解读“中国互联网新篇章:迈向产业融合”...
- 《全球人工智能产业地图》发布(附PPT图片)
- Michael I. Jordan——计算思维、推断思维与数据科学
- 密码学+赛博朋克,关于密码朋克们的奇妙故事
- 脉脉成为互联网大厂公敌
- 让图片动起来,特朗普和蒙娜丽莎深情合唱《Unravel》
- python 网页cookie的使用
- 深入学习QWidget-1