基于UDP协议的网络通信

ops/2024/10/11 0:57:43/

        和TCP协议不同的是,UDP协议不需要进行稳定的连接即可直接对数据进行收发,即面向非连接的。所以UDP的应用场景在音视频流传输、在线游戏以及网络聊天室等实时传输需求大的背景。因为不需要建立连接,UDP的网络编程模型就比TCP简单许多。

接收端发送端
创建socket创建socket
准备通信地址准备通信地址
绑定——
接收请求发送请求
响应请求接收响应
关闭socket关闭socket

从这个UDP的网络通信模型可以很直观地看到,TCP的通信双方是客户端和服务器,而UDP通信的双方只是发送端和接收端。下面来看具体实现操作:

首先来看一下接收端:

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <sys/un.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <netinet/in.h>int main(int argc,const char* argv[])
{//创建套接字int svrfd=socket(AF_INET,SOCK_DGRAM,0);if(svrfd<0){perror("socket");return -1;}//准备通信地址(自己)struct sockaddr_in svr_addr={},cli_addr={};svr_addr.sin_family=AF_INET;svr_addr.sin_port=htons(8888);svr_addr.sin_addr.s_addr=inet_addr("192.168.110.12");socklen_t addrlen=sizeof(svr_addr);//绑定地址与套接字if(bind(svrfd,(struct sockaddr *)&svr_addr,addrlen)){perror("bind");return -1;}char buf[4096];size_t buf_size=sizeof(buf);while(1){//接收数据和对方的地址size_t ret=recvfrom(svrfd,buf,buf_size,0,(struct sockaddr *)&cli_addr,&addrlen);if(ret<=0||0==strcmp("quit",buf)){printf("网络异常,通信结束!\n");close(svrfd);return -1;}printf("from %s recv:%s bits:%lu\n",inet_ntoa(cli_addr.sin_addr),buf,ret);//响应sprintf(buf,":return:%s",inet_ntoa(cli_addr.sin_addr));ret=sendto(svrfd,buf,strlen(buf)+1,0,(struct sockaddr *)&cli_addr,addrlen);if(ret<=0){printf("对方网络异常\n");}}close(svrfd);return 0;
}

再来看一下发送端:

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <sys/un.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <netinet/in.h>int main(int argc,const char* argv[])
{//创建套接字int clifd=socket(AF_INET,SOCK_DGRAM,0);if(clifd<0){perror("socket");return -1;}//准备通信地址(对方)struct sockaddr_in svr_addr={};svr_addr.sin_family=AF_INET;svr_addr.sin_port=htons(8889);svr_addr.sin_addr.s_addr=inet_addr("192.168.110.26");socklen_t addrlen=sizeof(svr_addr);char buf[4096];size_t buf_size=sizeof(buf);while(1){//发送请求printf(">>>>>");scanf("%s",buf);size_t ret=sendto(clifd,buf,strlen(buf)+1,0,(struct sockaddr *)&svr_addr,addrlen);if(ret<=0||0==strcmp("quit",buf)){printf("对方网络异常\n");close(clifd);break;}//接收响应ret=recvfrom(clifd,buf,buf_size,0,(struct sockaddr *)&svr_addr,&addrlen);if(ret<=0){printf("网络异常,通信结束!\n");close(clifd);return -1;}printf("from %s recv:%s bits:%lu\n",inet_ntoa(svr_addr.sin_addr),buf,ret);}close(clifd);return 0;
}

下面我来进行一下测试:

由上图,图2中由发送端发送数据到接收端,接收端接收并打印数据,并添加“:return”响应返回给发送端,最后输入quit结束通信,由此完成UDP的网络服务通信。


http://www.ppmy.cn/ops/123736.html

相关文章

5个免费ppt模板网站推荐!轻松搞定职场ppt制作!

每次过完小长假&#xff0c;可以明显地感觉到&#xff0c;2024这一年很快又要结束了&#xff0c;不知此刻的你有何感想呢&#xff1f;是满载而归&#xff0c;还是准备着手制作年终总结ppt或年度汇报ppt呢&#xff1f; 每当说到制作ppt&#xff0c;很多人的第一反应&#xff0c…

宠物空气净化器哪个牌子吸毛好?希喂、IAM、352真实测评

前段时间忙活了个大工程——热门宠物空气净化器大横评&#xff0c;通过多方位的测试&#xff0c;帮助不少朋友解决了宠物空气净化器的选购难题。 但我们还不局限于此&#xff0c;在从事家电行业这些年间&#xff0c;我们还花费大价钱购置一堆产品实测体验过各类大小家电产品&a…

React Fiber 详解

why Fiber React Fiber的引入主要基于以下几个方面的考虑&#xff1a; 性能提升&#xff1a; 传统React的更新过程是同步的&#xff0c;一旦开始更新就会阻塞浏览器的主线程&#xff0c;直到整个组件树更新完成。这在处理大型组件树或高频用户交互时&#xff0c;可能会导致界…

github/git密钥配置与使用

零、前言 因为要在ubuntu上做点东西&#xff0c;发现git clone 的时候必须输账户密码&#xff0c;后来发现密码是token&#xff0c;但是token一大串太烦了&#xff0c;忙了一天发现可以通过配置 公钥 来 替代 http 的 部署方式。 一、生成 ssh 密钥对 我们先测试下能不能 连接…

Qt QPushButton clicked信号浅析

前言 Qt 的 QPushButton clicked 信号原型&#xff1a; void clicked(bool checked false);通常&#xff0c;使用 Qt 的 QPushButton clicked 点击信号时&#xff0c;会以如下方式使用&#xff1a; connect(ui->pushButton, &QPushButton::clicked, this, [](){qDeb…

MinIO分片上传超大文件(纯服务端)

目录 一、MinIO快速搭建1.1、拉取docker镜像1.2、启动docker容器 二、分片上传大文件到MinIO2.1、添加依赖2.2、实现MinioClient2.3、实现分片上传2.3.0、初始化MinioClient2.3.1、准备分片上传2.3.2、分片并上传2.3.2.1、设置分片大小2.3.2.2、分片 2.3.3、分片合并 三、测试3…

PCL Harris3D关键点提取

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.1.1 Harris3D关键点提取 2.1.2 可视化函数 2.2完整代码 三、实现效果 PCL点云算法汇总及实战案例汇总的目录地址链接: PCL点云算法与项目实战案例汇总(长期更新) 一、概述 Ha…

GNU链接器(LD):PROVIDE、PROVIDE_HIDDEN关键字介绍

0 参考资料 GNU-LD-v2.30-中文手册.pdf GNU linker.pdf1 前言 一个完整的编译工具链应该包含以下4个部分&#xff1a; &#xff08;1&#xff09;编译器 &#xff08;2&#xff09;汇编器 &#xff08;3&#xff09;链接器 &#xff08;4&#xff09;lib库 在GNU工具链中&…