【网络编程】基于UDP的服务器端/客户端

UDP可看作是信件邮寄,邮寄过程可能会信件丢失,是一种不可靠的数据传输服务。

但UDP性能更高,实现更加简洁。流控制是区分UDP和TCP的最重要标志。

IP的作用就是让离开主机B的UDP数据包传递给主机B,UDP根据端口号将传到主机的数据包交付给最终的UDP套接字。

UDP的高效使用

对于网络实时传输视频或音频媒体数据而言丢失一部分数据没有问题,因为需要实时服务,速度就很重要。TCP比UDP慢主要由于

  • 收发数据前后进行的连接设置及清楚过程
  • 收发数据过程中为保证可靠性而添加的流控制

实现基于UDP的服务器端/客户端

UDP服务器端/客户端不需在连接状态下交换数据,无需连接过程,不必调用listen和accept函数。

UDP服务器端/客户端均只需一个套接字。

TCP套接字是一一对应的,若向10个客户端提供服务,除了守门的服务器套接字外还需10个服务器端套接字。UDP只需一个邮筒。

基于UDP的数据I/O函数

创建好TCP套接字后,传输数据时无需再添加地址信息,因为套接字间将保持连接,即TCP套接字知道目标地址信息。但UDP不会保持连接,因此每次传输数据都要添加目标地址信息。

#include<sys/socket.h>
ssize_t sendto(int sock,void *buff,size_t nbytes,int flags,struct sockaddr *to, socklen_t addrlen);
  • sock用于传输数据的UDP套接字文件描述符。
  • buff保存待传输数据的缓冲地址值。
  • nbytes待传输的数据长度,以字节为单位。
  • flags可选项参数,若没有则传递0。
  • to存有目标地址信息的sockaddr结构体变量的地址值。
  • addrlen传递给参数to的地址值结构体变量长度。

接收UDP数据函数

#include<sys/socket.h>
ssize_t recvfrom(int sock,void *buff,size_t nbytes,int flags,struct sockaddr *from, socklen_t addrlen);
  • sock用于传输数据的UDP套接字文件描述符。
  • buff保存待传输数据的缓冲地址值。
  • nbytes待传输的数据长度,以字节为单位。
  • flags可选项参数,若没有则传递0。
  • from存有发送端地址信息的sockaddr结构体变量的地址值。
  • addrlen传递给参数to的地址值结构体变量长度。

注意:UDP不同于TCP,不存在请求连接和受理过程,无法明确服务器端和客户端。

UDP客户端套接字的地址分配

UDP调用sendto函数时自动分配IP和端口号。

UDP的数据传输特性和调用connect函数

存在数据边界的UDP套接字

UDP是具有数据边界的协议,传输中调用I0函数的次数非常重要。因此,输入函数的调用次数应和输出函数的调用次数完全一致,这样才能保证接收全部已发送数据。例如,调用3次输出函数发送的数据必须通过调用3次输人函数才能接收完。

已连接UDP套接字与未连接UDP套接字

TCP套接字中需注册待传输数据的目标IP和端口号,而UDP则无需注册。通过sendto函数传输数据的3个阶段。

  1. 向UDP套接字注册目标IP和端口号。
  2. 传输数据。
  3. 删除UDP套接字中注册的目标地址信息。

未注册目标地址信息的套接字称为未连接套接字,注册了目标地址的套接字称为连接connected套接字。将UDP套接字变成已连接套接字会提高效率。

创建已连接UDP套接字的过程格外简单,只需针对UDP套接字调用connect函数,这不意味着要与对方UDP套接字连接,只是向UDP套接字注册目标IP和端口信息。

Sock=Socket(PF INET,SOCK DGRAM,0);
memset(&adr,0,sizeof(adr));
adr.sin family=AF INET;
adr.sin addr.saddr=.
adr.sin port=
connect(sock,(structsockaddr*)&adr,sizeof(adr));

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/26748.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python - OS模块+sys模块

一、OS模块基本用法&#xff1a; import osprint(os.getcwd()) # 获取当前工作目录os.chdir(data) # 改变当前脚本工作目录&#xff1b;相当于终端里面的cd命令 print(os.getcwd()) # 获取当前工作目录 运行结果&#xff1a; D:\__TC22008_VBF\FOTA-vFlash-AutoTest D:\__TC22…

js/javascript获取时间戳的5种方法

1.获取时间戳精确到秒,13位 const timestamp Date.parse(new Date()); console.log(timestamp);//输出 1591669256000 13位 2.获取时间戳精确到毫秒,13位 const timestamp Math.round(new Date()); console.log(timestamp);//输出 1591669961203 13位 3.获取时间戳精…

conda虚拟环境报错总结

创建conda虚拟环境 文章前景&#xff08;小白篇&#xff09;为什么要安装Anaconda&#xff1f;&#xff1f;&#xff1f; Conda创建虚拟环境遇到的错误总结错误1&#xff1a;jupyter 里面没有显示我的虚拟环境怎么办&#xff1f;错误2&#xff1a;配置pycharm的时候conda虚拟环…

百货商城优选 当嘉士利饼干成为艺术品

近日&#xff0c;全国各大美院毕业展正如火如荼展开&#xff0c;其中中国美院一学生的毕业作品——“记忆饼干”从中脱颖而出&#xff0c;引发关注。短短一天时间&#xff0c;“记忆饼干”相关视频在全网已收获超7w网友点赞与收藏&#xff0c;更是激发网友们不断去线下打卡合影…

破解发展难题 台山这家合作社以农业社会化服务助推乡村振兴

风吹稻田千层浪&#xff0c;眼下&#xff0c;台山四九镇的早稻长势喜人&#xff0c;沉甸甸的稻穗迎风而动&#xff0c;已进入破口抽穗的关键期&#xff0c;即将在6月底陆续迎来丰收。在台山市明华汇种养专业合作社管理的稻田里&#xff0c;合作社负责人梁明喜正仔细观察着稻苗的…

node aws

基础&#xff08;菜鸟教程&#xff09;框架&#xff1a; expressEgg.js(底层框架express)koa(自定义强&#xff0c;小而精简&#xff0c;白话就是什么都没有&#xff0c;自己diy&#xff0c;考验架构技术&#xff0c;搞得好比nest.js开发效率还高&#xff0c;同时框架精简)nest…

消费全返如何盈利?新零售分销营销模式解析

在当今竞争激烈的商业环境中&#xff0c;如何有效地吸引并留住顾客&#xff0c;同时实现销售额的持续增长&#xff0c;是每个商家都在思考的问题。我们团队经过深入研究和实践&#xff0c;成功开发了一套积分消费全返模式&#xff0c;它不仅帮助贵州的一位老板在短短一年内实现…

持续总结中!2024年面试必问 20 道并发编程面试题(四)

上一篇地址&#xff1a;持续总结中&#xff01;2024年面试必问 20 道并发编程面试题&#xff08;三&#xff09;-CSDN博客 七、请解释什么是原子操作。 原子操作&#xff08;Atomic Operation&#xff09;是指在多线程环境中&#xff0c;一个操作或者一系列操作&#xff0c;要…

山东大学软件学院项目实训-创新实训-基于大模型的旅游平台(三十二)- 微服务(12)

目录 12.8 RestClient查询文档 12.8.1 快速入门 12.8.2 match&#xff0c; term&#xff0c;bool&#xff0c;range查询 12.8.3 排序和分页 12.8.4 高亮 12.8 RestClient查询文档 12.8.1 快速入门 Testvoid testMatchALL() throws IOException {// 1. 准备requestSearchReq…

以bert为例,了解Lora是如何添加到模型中的

以bert为例,了解Lora是如何添加到模型中的 一.效果图1.torch.fx可视化A.添加前B.添加后 2.onnx可视化A.添加前B.添加后 3.tensorboard可视化A.添加前B.添加后 二.复现步骤1.生成配置文件(num_hidden_layers1)2.运行测试脚本 本文以bert为例,对比了添加Lora模块前后的网络结构图…

Linux下的GPIO编程

目录 一、前言 二、sysfs方式 1、sysfs简介 2、基本目录结构 3、编号计算 4、sysfs方式控制GPIO 三、libgpiod库 1、libgpiod库简介 2、API函数 四、LED灯编程 一、前言 在Linux下&#xff0c;我们通常使用 sysfs 和 libgpiod库 两种方式进行控制GPIO&#xff0c;目前…

DDei在线设计器-属性编辑器

DDei-Core-属性编辑器 DDei-Core-属性编辑器插件包含了文本、大文本、数值、下拉、单选、勾选以及颜色等属性编辑。 图形和属性共同构成一个完整的定义&#xff0c;属性编辑器就是编辑属性值的控件。当选中图形实例时&#xff0c;属性面板就会展现当前实例的所有属性以及属性编…

通过身份证号码计算年龄

一、需求分析 在一些需要精确统计用户年龄的场景中。 如果我们使用之间由用户填写自己年龄的方式的话&#xff0c;就无法保证用户填写的信息是准确的其中最有效的办法就是让用户进行实名认证&#xff0c;再由用户上传的身份证号码截取到出生日期&#xff0c;通过计算后得到用…

m4s转mp3——B站缓存视频提取音频

前言 しかのこのこのここしたんたん&#xff08;鹿乃子乃子虎视眈眈&#xff09;非常之好&#xff0c;很适合当闹钟&#xff0c;于是缓存了视频&#xff0c;想提取音频为mp3 直接改后缀可乎&#xff1f;格式转换工具&#xff1f; 好久之前有记录过转MP4的&#xff1a; m4s转为…

nacos配置实时刷新@RefreshScope注解和定时任务@Scheduled注解同时使用导致失效问题

RefreshScope和Scheduled的组合使用有时会导致Scheduled任务失效&#xff0c;主要是由于它们在Spring中的工作机制不同。 RefreshScope的工作原理 RefreshScope是Spring Cloud中的一个注解&#xff0c;它允许在应用运行时刷新bean的属性&#xff0c;而不需要重启应用程序。具…

美国空军发布类ChatGPT产品—NIPRGPT

6月11日&#xff0c;美国空军研究实验室&#xff08;AFRL&#xff09;官网消息&#xff0c;空军部已经发布了一款生成式AI产品NIPRGPT。 据悉&#xff0c;NIPRGPT是一款类ChatGPT产品&#xff0c;可生成文本、代码、摘要等内容&#xff0c;主要为为飞行员、文职人员和承包商提…

文件没有权限问题:cannot create /opt/apollo/neo/data/log/monitor.log: Permission denied

问题描述 执行 aem bootstrap start --plus 命令启动 Dreamview 提示错误&#xff1a; /bin/sh: 1: cannot create /opt/apollo/neo/data/log/monitor.log: Permission denied [ERROR] Failed to start Dreamview. Please check /opt/apollo/neo/data/log/dreamview.log or /op…

【React】在 React 组件中,怎么使用useContext

在React中,useContext 是一个Hook,它允许你无需显式地通过组件树的每一层来传递 props,就能将值深入到组件树的任何位置。要使用 useContext,你需要先创建一个 Context 对象,然后使用这个对象提供的 Provider 组件来包裹你的应用中的一部分。然后,任何在这个 Provider 下…

使用R语言生成CDISC SDTM.AE domain

写在前面 - 使用的是Rstudio - 其实R已经有生成sdtm相关的package&#xff0c;以下代码仅作为练习R语言的语法&#xff0c;不是高效生成sdtm的方法 - 代码中没有解决的问题包括&#xff1a;EPOCH相关的逻辑没有考虑partial date的情况&#xff1b;在使用arrange() function做…

ArrayList和LinkedList的区别!!!

总结&#xff1a; 1、数据结构的实现 ArrayList&#xff1a;动态数组。 LinkedList&#xff1a;双向链表。 2、时间复杂度不同 ArrayList&#xff1a;O(1) LinkedList: O(n) ①&#xff1a;随机访问---- ArrayList > LinkedList &#xff08;ArrayList采用下标&#xff0…