UDP 广播

news/2024/5/18 11:52:46 标签: udp, 网络协议, 网络, 广播

一、UDP 通信图解

UDP通信、本地套接字_呵呵哒( ̄▽ ̄)"的博客-CSDN博客icon-default.png?t=N6B9https://blog.csdn.net/weixin_41987016/article/details/132523536?spm=1001.2014.3001.5501

#include <sys/types.h>
#include <sys/socket >
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, socklen_t addrlen);
	- 参数:
		- sockfd : 通信的fd
		- buf : 要发送的数据
		- len : 发送数据的长度
		- flags : 0
		- dest_addr : 通信的另外一端的地址信息
		- addrlen : 地址的内存大小
	
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen);
	- 参数:
		- sockfd : 通信的fd
		- buf : 接收数据的数组
		- len : 数组的大小
 
		- flags : 0
		- src_addr : 用来保存另外一端的地址信息,不需要可以指定为NULL
		- addrlen : 地址的内存大小

二、广播

广播:向子网中多态计算机发送消息,并且子网中所有计算机都可以接收到发送方发送的消息,每个广播消息都包含一个特殊的IP地址,这个IP中子网内主机标志部分的二进制全部为1

        🐞 a.只能在局域网中使用

        🐞 b.客户端需要绑定服务器广播使用的端口,才可以接收到广播信息

// 设置广播属性的函数
int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen);
    - sockfd : 文件描述符
    - level : SOL_SOCKET
    - optname : SO_BROADCAST
    - optval : int类型的值,为1表示允许广播
    - optlen : optval的大小

bro_server.c

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <arpa/inet.h>

int main () {
    // 1.创建一个通信的socket
    int fd = socket(PF_INET, SOCK_DGRAM, 0);
    if(fd == -1) {
        perror("socket");
        exit(-1);
    }

    // 2.设置广播属性
    int op = 1;
    setsockopt(fd, SOL_SOCKET, SO_BROADCAST, &op, sizeof(op));

    // 3.创建一个广播的地址
    struct sockaddr_in broaddr;
    broaddr.sin_family = AF_INET;
    broaddr.sin_port = htons(9999);
    // broaddr.sin_addr.s_addr = inet_addr("192.168.90.255");
    inet_pton(AF_INET,"192.168.90.255",&broaddr.sin_addr.s_addr);//设置广播地址,必须为本机/虚拟机的广播地址才行

    // 3.通信
    int num = 0;
    while (1) {
        char sendBuf[128];
        sprintf(sendBuf,"hello,client....%d\n",num++);
        // 发送数据
        sendto(fd,sendBuf,strlen(sendBuf) + 1,0,(struct sockaddr*)&broaddr,sizeof(broaddr));
        printf("广播的数据:%s\n",sendBuf);
        sleep(1);
    }
    close(fd);
    return 0;
}

bro_client.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>

int main () {
    // 1.创建一个通信的socket
    int fd = socket(PF_INET,SOCK_DGRAM,0);
    if(fd == -1) {
        perror("socket");
        exit(-1);
    }

    // 2.客户端绑定本地的IP和端口
    struct sockaddr_in addr;
    addr.sin_family = AF_INET;
    addr.sin_port = htons(9999);
    addr.sin_addr.s_addr = INADDR_ANY;

    int ret = bind(fd,(struct sockaddr *)&addr,sizeof(addr));
    if(ret == -1) {
        perror("bind");
        exit(-1);
    }

    // 3.通信
    while(1) {
        char buf[128];
        // 接收数据
        int num = recvfrom(fd,buf,sizeof(buf),0,NULL,NULL);
        printf("server say: %s\n",buf);
    }

    close(fd);
    return 0;
}


http://www.niftyadmin.cn/n/4979213.html

相关文章

skywalking agent监控java服务

一、前言 skywalking agent可以监控的服务类型有多种&#xff0c;python、go、java、nodejs服务等都可以监控&#xff0c;现在通过java服务来演示skywalking agent的使用&#xff0c;并且是使用容器的方式实现 二、部署skywalking agent监控 需要注意&#xff0c;skywalking…

C# Windows系统一键关机源代码共享

C# Windows系统一键关机源代码&#xff0c;可移植(复制粘贴)到的自己的项目中 exe可执行文件下载 C# 源码下载 using System; using System.Windows; using System.Windows.Threading;namespace 关机 {/// <summary>/// MainWindow.xaml 的交互逻辑/// </summary&g…

高速公路自动驾驶汽车超车控制方法研究

目录 摘要 ............................................................................................................ I Abstract ...................................................................................................... II 目录 ...............…

编程之道:【性能优化】提升软件效率的原则和方法

在今天的数字化世界中&#xff0c;软件性能对于用户体验和应用程序的成功至关重要。无论是网页加载速度、移动应用的响应时间还是大型服务器的处理能力&#xff0c;性能优化都扮演着关键的角色。本文将介绍性能优化的基本原则和方法&#xff0c;帮助开发人员提升软件效率。 性能…

【数据分析】统计量

1. 均值、众数描述数据的集中趋势度量&#xff0c;四分位差、极差描述数据的离散程度。 2. 标准差、四分位差、异众比率度量离散程度&#xff0c;协方差是度量相关性。 期望值分别为E[X]与E[Y]的两个实随机变量X与Y之间的协方差Cov(X,Y)定义为&#xff1a; 从直观上来看&…

Excel显示此值与此单元格定义的数据验证限制不匹配怎么办?

总结&#xff1a;1、在编辑excel文档的时候&#xff0c;弹出此时预测单元格定义的数据验证&#xff0c;限制不匹配的提示。2、这是我们点击菜单来的数据菜单。3、然后点击数据工具栏的数据验证下拉按钮。4、在弹出的菜单中选择数据验证的菜单项。5、然后在打开的窗口中点击左下…

docker高级(DockerFile解析)

1、构建三步骤 编写Dockerfile文件 docker build命令构建镜像 docker run依镜像运行容器实例 2、DockerFile构建过程解析 Dockerfile内容基础知识 1&#xff1a;每条保留字指令都必须为大写字母且后面要跟随至少一个参数 2&#xff1a;指令按照从上到下&#xff0c;顺序执行…

Android studio打包生成jar包文件

将应用模块application转换成库模块library后生成jar包 1、首先打开build.gradle文件&#xff0c;注意这里是module目录下的&#xff0c;在这个文件我们需要做两个操作&#xff1a; 将com.android.application改成com.android.library注释掉applicationId 2、打开清单文件And…