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

news2025/6/27 12:35:49

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.coloradmin.cn/o/1822589.html

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

相关文章

6.14工作总结

今天上午&#xff0c;我把之前睿哥吩咐我的任务忙完之后&#xff0c;他就叫我看一下代码。 他跟我说公司的项目用的是微服务的。其实我不懂微服务是个啥&#xff0c;就只知道这个名字。 然后&#xff0c;我把设备管理系统的后端代码展示给他看&#xff0c;他给我指了指&#…

C4D如何预览动画?C4D动画云渲染助力

C4D是一款功能丰富的3D设计软件&#xff0c;以其快速的预览渲染和多样的渲染插件而闻名&#xff0c;其卓越的渲染效果赢得了CG行业专业人士的广泛赞誉。尽管C4D的渲染功能十分强大&#xff0c;但对于初学者而言&#xff0c;其复杂的渲染设置可能会带来一些挑战。本文一起来看看…

Rollup 打包一个 JavaScript 项目

export default {input: "./src/FFCesium/core/index.js", // 输入文件output: {file: "public/lastVersion/FFCesium.confuse.js", // 输出文件//format: "cjs", // 打包格式为cjsformat: "es",exports: "default", // 或者…

计算机网络学习3

文章目录 以太网的MAC帧格式虚拟局域网VLAN概述虚拟局域网VLAN的实现机制以太网的发展802.11无线局域网的组成无线局域网的物理层无线局域网的数据链路层---使用CSMA/CD协议802.11无线局域网的MAC帧 网络层网络层概述网际协议IP和4.2.1异构网络互联IPv4地址及其编址方法概述IPv…

产品规划之精益画布的四大注意事项

精益画布要求团队从用户的角度出发&#xff0c;明确用户痛点和需求&#xff0c;关注用户体验&#xff0c;提高用户满意度和产品市场匹配度&#xff0c;有利于产品迭代与验证&#xff0c;提高了市场适应性和资源配置效率&#xff0c;降低项目潜在风险。 如果没有使用精益画布&am…

什么是断言?

一、assert是个啥&#xff1f; 断言是为了方便调试程序&#xff0c;并不是发布程序的组成部分。理解这一点是很关键的。 在C和C语言中都有assert关键字&#xff0c;表示断言。 java 也不例外&#xff0c;在Java SE 1.4版本以后也增加了断言的特性。 默认情况下&#xff0c;JV…

【QT5】<总结> QT主要技术点

文章目录 前言 一、QT串口编程 二、QT网络编程 三、QT多线程 四、QT连接数据库 五、开发板上运行QT程序 前言 在学习QT的过程中&#xff0c;旨在更好地巩固所学到的知识&#xff0c;本篇总结QT在嵌入式开发中的主要技术点。 一、QT串口编程 思维导图&#xff1a; 知识点…

金融科技助力绿色金融:可持续发展新动力

随着全球气候变化和环境问题的日益严重&#xff0c;绿色金融作为推动环境保护和经济可持续发展的重要手段&#xff0c;已经受到越来越多的关注。而金融科技&#xff0c;作为科技与金融深度融合的产物&#xff0c;正以其独特的优势为绿色金融的发展注入新动力。本文将探讨金融科…

UE5-不同材质上脚步声

主要是用物理材质给不同的材质加一个标签 创建材质 首先去设置里面创建几个地形材质名称&#xff0c;我这里创建了Grass&#xff0c;Rock&#xff0c;Wood&#xff0c;Water &#xff08;就是名字而已&#xff09; 然后创建物理材质&#xff08;物理材质可以添加到现有的普通…

使用Spring AI 和 LLM 实现数据库查询

AIDocumentLibraryChat 项目已扩展为支持提问来搜索关系数据库。用户可以输入一个问题&#xff0c;然后嵌入搜索相关的数据库表和列来回答问题。然后&#xff0c;LLM 获取相关表的数据库架构&#xff0c;并根据找到的表和列生成一个 SQL 查询&#xff0c;来展示结果回答问题。 …

JAVA动态表达式:Antlr4 表达式树解析

接上面 JAVA动态表达式&#xff1a;Antlr4 G4 模板 读取字符串表达式结构树-CSDN博客 目前已经实现了常量及分组常规表达式的解析。 String formula "啦啦啦1 and 11 and 23 and 1123 contains 1 and 23455 notcontains 5"; String formula "啦啦啦1 and (…

基于JSP技术的电子商城系统

开头语&#xff1a; 你好&#xff0c;我是计算机学长码农猫哥。如果你对电子商城系统感兴趣或有相关开发需求&#xff0c;欢迎联系我。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;JSP技术 工具&#xff1a;Eclipse、Tomcat 系统展示 首页 管理…

算法007:三数之和

. - 力扣&#xff08;LeetCode&#xff09;. - 备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/3sum/ 这个题相较于前几个题来说比较难&#xff0c;思想是前面一个题目…

【MySQL】mysql中常见的内置函数(日期、字符串、数学函数)

文章目录 案例表日期函数字符串函数数学函数其他函数 案例表 emp students 表 exam_result 表 日期函数 注意current_time和now的区别 案例一&#xff1a; 创建一张表用来记录生日&#xff0c;表结构如下 添加日期&#xff1a; insert tmp (birthday) values (2003-01-3…

Matrix->Matrix工具类获取Matrix的平移、缩放、错切数值

// 传入矩阵&#xff0c;获取矩阵数值 class MatrixValues(matrix: Matrix) {val scaleX: Floatval scaleY: Floatval transX: Floatval transY: Floatval skewX : Float val skewY : Floatinit {val fromValues FloatArray(9)matrix.getValues(fromValues)// 缩放数值scaleX …

1、MFC应用程序框架

MFC简介 MFCMFC样式 MFC应用程序框架单文档应用程序框架工程文件的组成结构 MFC应用程序框架分析SDK应用程序和MFC应用程序运行过程对比MFC应用程序框架主要类之间的关系 MFC消息映射机制概述消息消息映射机制Windows消息分类消息映射表 添加消息处理函数各种Windows消息的消息…

Linux 系统删除乱码文件

项目场景&#xff1a; 通过rm -rf 删除乱码文件&#xff0c;删除不了 问题描述 这时直接使用命令rm -rf 是删除不了的。只能通过删除 inode方法处理。 原因分析&#xff1a; 在Linux上传文件或文件夹时&#xff0c;由于出现连接中断&#xff0c;出现了大量的乱码文件&#…

顶顶通呼叫中心中间件(mod_cti基于FreeSWITCH)-通话时长限制

文章目录 前言联系我们场景运用机器人场景普通通话场景 前言 顶顶通呼叫中心中间件限制通话时长有两种写法&#xff0c;分别作用于机器人场景与普通通话场景。 普通场景可分为分机互打、分机外呼手机等。 联系我们 有意向了解呼叫中心中间件的用户&#xff0c;可以点击该链接…

Sping源码(九)—— Bean的初始化(非懒加载)— lookupMethod标签

序言 在继续深入Spring的对象创建流程之前&#xff0c;这篇文章先简单介绍一下lookupMethod标签的用法及作用。 准备的xml 自定义名为methodOverride.xml的配置文件。 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.s…

旅行者1号有什么秘密?飞行240多亿公里,为什么没发生碰撞?

旅行者1号有什么秘密&#xff1f;飞行240多亿公里&#xff0c;为什么没发生碰撞&#xff1f; 自古以来&#xff0c;人类就对浩瀚无垠的宇宙充满了好奇与向往。从最初的仰望星空&#xff0c;到如今的深空探测&#xff0c;人类探测宇宙的历史发展可谓是一部波澜壮阔的史诗。 在…