【C/C++套接字编程】UDP通信实验

news/2024/5/18 14:26:38 标签: udp, c语言, c++

目录

一、实验目的:

二、实验内容简要描述

三、实验步骤与结果分析

四、结论


 系列博客

【C/C++套接字编程】套接字的基本概念与基础语法_Mr_Fmnwon的博客-CSDN博客

【C/C++套接字编程】TCP协议通信的简单实现_Mr_Fmnwon的博客-CSDN博客

【C/C++套接字编程】UDP协议通信的简单实现_Mr_Fmnwon的博客-CSDN博客

【C/C++套接字编程】TCP通信实验_Mr_Fmnwon的博客-CSDN博客


一、实验目的:

通过本实验使学员了解和掌握编写基于UDP协议的网络应用程序。任务是开发一个基于UDP Socket API的网络聊天程序。


二、实验内容简要描述

用所学的UDP Socket API知识来开发基于UDP协议的网络。通过编程实现服务端和客户端的信息通信。UDP协议建立交互的流程如下图所示。通过编写C/C++程序,调用windows提供的Socket API,模拟下述流程,建立客户端与服务端的远程UDP通信。使得彼此双方能够接收彼此信息、发送信息。


三、实验步骤与结果分析

基于UDP协议的面向客户/服务器的工作流程是:

  • 服务端

Ⅰ 服务器首先启动,调用 socket( )创建套接字;

Ⅱ 然后调用bind( )指定本地(服务器)socket地址(IP地址+端口号);

Ⅲ 接着就可以等着接收客户的信息,并在过程中获取客户端地址信息,开始交互

Ⅳ 交互完成,并不继续后,通过Close释放套接字

  • 客户端

Ⅰ 客户端首先启动,调用 socket( )创建套接字;

Ⅱ 然后调用bind( )指定本地(客户端)socket地址(IP地址+端口号);

Ⅲ 准备好服务器的地址(IP地址+端口号);

Ⅳ 通过sendto(),经客户端socket向目的地址发送数据,recvfrom接收数据,开始交互

Ⅴ 交互完成,并不继续后,通过Close释放套接字


服务端:

1、启动,调用 socket( )创建套接字;

2、调用bind( )指定本地(服务器)socket地址(IP地址+端口号);

3、等着接收客户的信息,并在过程中获取客户端地址信息,开始交互

4、交互完成,并不继续后,通过Close释放套接字


客户端:

1、启动,调用 socket( )创建套接字;

2、调用bind( )指定本地(客户端)socket地址(IP地址+端口号);

3、准备好服务器的地址(IP地址+端口号);

4、通过sendto(),经客户端socket向目的地址发送数据,recvfrom接收数据,开始交互

5、交互完成,并不继续后,通过Close释放套接字


基于以上连接策略实现的简易UDP通信结果如下:

服务端

客户端


四、结论

此次实验,让我更加了解了UDP协议的过程,同时也初步掌握了C++ Socket编程的基础技能,更让我在实际的应用中,尝试使用多线程、利用控制字符美化交互环境等等,受益匪浅。

对于控制打印的函数,自己通过摸索,也有了很大的收获:

           打印时间

         通过套接字获取地址

         回退到黑窗口上一行并覆写

此外,通过TCP/UDP两个实验的对比与实现,对于两者通信方式、过程中的相似与不同之处,有了更深的了解。例如,对于实现多个客户端与服务端的通信,UDP实现起来很自然而简单,相较于TCP的多线程实现,其本质上是因为两者是否面向对象的区别。然而在将TCP/UDP向应用方向拓展时,不可避免地都应该采用多线程的处理方式以带来良好的用户体验。

对于实现“聊天室”——广播与组播的功能或者仿照实现,需要进一步地理解与探索,这在我之后的探索中,是一个方向。


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

相关文章

封装一个vue倒计时的组件

下面是一个简单的 Vue 倒计时组件的示例&#xff1a; <template><div><p>倒计时: {{ remainingTime }}</p></div> </template><script> export default {data() {return {remainingTime: 0,intervalId: null};},props: {duration: …

快速选择合适的GNSS模拟器,看这几个重点

为了正确测试GNSS接收器或其他任何依赖GNSS信号的系统或设备&#xff0c;工程师需要模拟与真实卫星广播相同的RF信号&#xff0c;而使用GNSS模拟器是实现这一工作的最佳选择。 假设正在开发一种需要集成GNSS接收器的新产品&#xff0c;想要验证接收器设备在不同条件下是否运行…

Screen (Linux)

安装 (sudo) apt-get install screen查询命令 screen -help创建终端 screen -S <Name>查询正在运行的终端 screen -ls 例如&#xff1a; 其中&#xff0c;24372 终端ID&#xff0c; IDB 终端Name 重连终端 screen -R/-r <ID/Name>[虚拟终端PID或Name] 挂起终端&…

快手web验证日志分析

文章目录 log参数session_ididentityproject_id 流程1-4请求参数sign日志formdata828586 log参数 为了确定日志中是否有参数和IP绑定&#xff0c;检查了session_id参数。 session_id session_id i (wn[e[t 0]] wn[e[t 1]] wn[e[t 2]] wn[e[t 3]] "-" wn…

企业为什么要关注库存?因为那都是“钱”!

库存是企业管理的核心&#xff0c;公司必须提供足够的商品来满足客户需求&#xff0c;但又不能冒着浪费金钱和资源的风险&#xff0c;一味的增加库存。 不同的企业在库存管理这个问题上就“八仙过海各显神通”了&#xff0c;常见的处理方法有&#xff1a; 1. 经验法&#xff1a…

【MySQL篇】Select语句原理详解

文章目录 MYSQL体系结构模块详解架构分层连接层服务层存储引擎 SQL的执行流程连接查询缓存语法解析和预处理词法解析语法分析预处理器 查询优化器执行计划存储引擎存储引擎基本介绍如何选择存储引擎&#xff1f; 执行引擎举例说明 对于一个开发工程师来说&#xff0c;了解一下 …

SpringBoot不在使用@Validated 做参数校验但是不想在Controller层怎么办?

目录 场景再现&#xff1a; 怎么做&#xff1f; 遇到了什么问题&#xff1f; 怎么实现&#xff1f; 场景再现&#xff1a; 某API接口接受加密的json字符串&#xff0c;接受字符串之后先进行解密处理&#xff0c;解密完成之后还要进行参数校验处理&#xff0c;如果参数不合规…

网络安全学术顶会——CCS '22 议题清单、摘要与总结(中)

注意&#xff1a;本文由GPT4与Claude联合生成。 81、HammerScope: Observing DRAM Power Consumption Using Rowhammer 内存单元尺寸的不断缩小使得内存密度提高&#xff0c;功耗降低&#xff0c;但同时也影响了其可靠性。Rowhammer攻击利用这种降低的可靠性在内存中引发比特翻…