当前位置: 首页 > article >正文

TIME_WAIT状态+UDP概念及模拟实现服务器和客户端收发数据

目录

一、TIME_WAIT状态存在的原因

二、TIME_WAIT状态存在的意义

三、TIME_WAIT状态的作用

四、UDP的基本概念

4.1 概念

4.2 特点

五、模拟实现UDP服务器和客户端收发数据

5.1 服务器udpser

5.2 客户端udpcil 


一、TIME_WAIT状态存在的原因

1.可靠的终止TCP连接。

2.保证让迟来的TCP报文段有足够的时间被识别并丢弃。

二、TIME_WAIT状态存在的意义

TIME_WAIT状态存在的主要目的是为了确保已传输的数据在网络中正确地到达目的地,同时避免出现数据包重复发送或混乱的情况。

三、TIME_WAIT状态的作用

  1. 确保数据传输的完整性:在发送端完成数据传输后,主动关闭连接的一方会进入TIME_WAIT状态,此时会等待一段时间,以确保对方接收到了所有数据,并且成功响应了关闭连接的请求。这样可以保证数据的完整性,避免数据丢失或损坏。

  2. 防止出现混乱的连接状态:TIME_WAIT状态可以确保在一段时间内不会重用相同的本地端口和远程端口的连接,防止新的连接与之前的连接混淆,导致数据混乱或连接失败。

  3. 处理延迟的数据包:在TIME_WAIT状态下,可以处理由于网络延迟而导致的延迟数据包,以确保数据传输的顺利完成。此外,TIME_WAIT状态还可以避免在网络中产生冲突或重复数据包发送的情况。

简而言之,TIME_WAIT状态的存在可以确保数据传输的可靠性和完整性,同时避免网络连接的混乱和冲突,提高网络通信的稳定性和可靠性。

四、UDP的基本概念

4.1 概念

UDP(User Datagram Protocol,用户数据报协议)是一种无连接的、简单和高效的网络传输协议。UDP提供了一种不可靠的、无序的数据传输服务,相比于TCP协议,UDP不具备建立连接、可靠传输和数据重传等特性。

总的来说,UDP是一种简单、高效的传输协议,适用于对数据传输速度和实时性要求较高,对数据准确性要求较低的场景。

4.2 特点

  1. 无连接:UDP不需要像TCP那样建立连接和维护状态,因此可以更快速地传输数据。每个UDP数据包都是独立的,发送方和接收方之间没有直接的关联,因此UDP适用于实时性要求较高的应用场景。

  2. 不可靠性:UDP不提供可靠的数据传输服务,数据包可能丢失、重复或乱序到达,接收方无法检测到这些问题。因此,在对数据的准确性要求不那么高的场合,可以选择UDP协议进行数据传输。

  3. 面向报文:UDP 对应用程序交下来的报文,在添加首部后就向下交付给 IP 层,既不拆分也不合并,保留报文边界 。这要求应用程序选择合适报文大小 。

  4. 简单和高效:UDP的头部信息较简单,不像TCP那样需要维护连接状态和处理复杂的传输控制。这使得UDP在一些对实时性和效率要求较高的应用场景中具有优势,比如音视频传输、在线游戏等。

五、模拟实现UDP服务器和客户端收发数据

5.1 服务器udpser

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<netinet/in.h>int main()
{int sockfd=socket(AF_INET,SOCK_DGRAM,0);if(sockfd==-1){exit(1);}struct sockaddr_in saddr,caddr;memset(&saddr,0,sizeof(saddr));saddr.sin_family=AF_INET;saddr.sin_port=htons(6000);saddr.sin_addr.s_addr=inet_addr("127.0.0.1");int res=bind(sockfd,(struct sockaddr*)&saddr,sizeof(saddr));if(res==-1){printf("bind err\n");exit(1);}while(1){int len =sizeof(caddr);char buff[128]={0};recvfrom(sockfd,buff,127,0,(struct sockaddr*)&caddr,&len);//接收数据,可能会阻塞printf("buff=%s\n",buff);sendto(sockfd,"ok",2,0,(struct sockaddr*)&caddr,sizeof(caddr));}
}
  1. 首先,在main函数中创建一个UDP套接字(sockfd):通过调用socket函数创建了一个IPv4协议的数据报套接字。如果创建失败,则程序退出。

  2. 然后,初始化服务器地址结构体saddr:设置地址族为AF_INET(IPv4)、端口号为6000,并将IP地址设置为本地回环地址“127.0.0.1”。

  3. 进行绑定:使用bind函数将套接字与服务器地址绑定。如果绑定失败,输出错误信息并退出程序。

  4. 进入循环:程序进入一个无限循环,等待接收客户端发送的数据包。

  5. 调用recvfrom函数接收数据:recvfrom会阻塞等待客户端发来的数据包,一旦接收到数据包,将数据存储在buff数组中,并打印出接收到的数据内容。

  6. 调用sendto函数发送数据:sendto函数将"ok"字符串回复给客户端,回复的目标地址是客户端的地址(caddr)。

5.2 客户端udpcil 

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<netinet/in.h>int main()
{int sockfd=socket(AF_INET,SOCK_DGRAM,0);if(sockfd==-1){exit(1);}struct sockaddr_in saddr;//代表服务器ip和端口saddr.sin_family=AF_INET;saddr.sin_port=htons(6000);saddr.sin_addr.s_addr=inet_addr("127.0.0.1");while(1){printf("input:\n");char buff[128]={0};fgets(buff,128,stdin);if(strncmp(buff,"end",3)==0){break;}sendto(sockfd,buff,strlen(buff)-1,0,(struct sockaddr*)&saddr,sizeof(saddr));memset(buff,0, 128);int len =sizeof(saddr);recvfrom(sockfd,buff,127,0,(struct sockaddr*)&saddr,&len);printf("buff=%s\n",buff);}
}
  1. 在main函数中创建一个UDP套接字(sockfd):通过调用socket函数创建了一个IPv4协议的数据报套接字。如果创建失败,则程序退出。

  2. 初始化服务器地址结构体saddr:设置地址族为AF_INET(IPv4)、端口号为6000,并将IP地址设置为本地回环地址“127.0.0.1”。

  3. 进入循环:程序进入一个无限循环,每次循环都提示用户输入消息并发送给服务器。

  4. 用户输入消息:使用fgets函数从标准输入(stdin)读取用户输入的消息存储在buff数组中。如果用户输入"end",则跳出循环。

  5. 发送数据给服务器:调用sendto函数将用户输入的消息发送给服务器。

  6. 接收服务器的回复:调用recvfrom函数从服务器接收回复消息,将回复消息存储在buff数组中,并打印出来。

  7. 循环结束:如果用户输入"end"则退出循环,结束程序。

运行结果:

相关文章:

TIME_WAIT状态+UDP概念及模拟实现服务器和客户端收发数据

目录 一、TIME_WAIT状态存在的原因 二、TIME_WAIT状态存在的意义 三、TIME_WAIT状态的作用 四、UDP的基本概念 4.1 概念 4.2 特点 五、模拟实现UDP服务器和客户端收发数据 5.1 服务器udpser 5.2 客户端udpcil 一、TIME_WAIT状态存在的原因 1.可靠的终止TCP连接。 2.…...

Rust 学习笔记:关于枚举与模式匹配的练习题

Rust 学习笔记&#xff1a;关于枚举与模式匹配的练习题 Rust 学习笔记&#xff1a;关于枚举与模式匹配的练习题以下程序能否通过编译&#xff1f;若能&#xff0c;输出是什么&#xff1f;考虑这两种表示结果类型的方式&#xff0c;若计算成功&#xff0c;则包含值 T&#xff1b…...

快速了解Go+微服务(概念和一个例子)

更多个人笔记&#xff1a;&#xff08;仅供参考&#xff0c;非盈利&#xff09; gitee&#xff1a; https 文章目录 基本概念grpc和简单demo 基本概念 特点&#xff1a; 单一职责&#xff1a;一个服务用来解决一个业务问题面向服务&#xff1a;一个服务封装并对外提供服务&am…...

一篇撸清 Http,SSE 与 WebSocket

HTTP,SSE 和WebSocket都是网络传输的协议,本篇快速介绍三者的概念和比较。 SSE(Server-Sent Events) 是什么? SSE(Server-Sent Events),服务器发送事件, 是一种基于 HTTP 的轻量级协议,允许服务器主动向客户端(如浏览器)推送实时数据。它设计用于单向通信(服务器到…...

56、【OS】【Nuttx】编码规范解读(四)

背景 接之前 blog 53、【OS】【Nuttx】编码规范解读&#xff08;一&#xff09; 54、【OS】【Nuttx】编码规范解读&#xff08;二&#xff09; 55、【OS】【Nuttx】编码规范解读&#xff08;三&#xff09; 分析了行宽格式&#xff0c;注释要求&#xff0c;花括号风格等&#…...

IOT项目——DIY 气象站

开源项目&#xff1a;ESP32 气象站 作者&#xff1a;GiovanniAggiustatutto 原文链接&#xff1a;原文 开源项目&#xff1a;太阳能 WiFi 气象站 V4.0 作者&#xff1a;opengreenenergy 原文链接&#xff1a;原文 DIY 气象站 简介1-制版2-物料 温度设备塔风向标风速计雨量计框…...

MODSIM选型指南:汽车与航空航天企业如何选择仿真平台

1. 引言 在竞争激烈的汽车与航空航天领域&#xff0c;仿真技术已成为产品研发不可或缺的环节。通过在设计阶段验证概念并优化性能&#xff0c;仿真平台能有效缩短开发周期并降低物理样机制作成本。 MODSIM&#xff08;建模与仿真&#xff09;作为达索系统3DEXPERIENCE平台的核…...

【JavaEE】springMVC返回Http响应

目录 一、返回页面二、Controller和ResponseBody与RestController区别三、返回HTML代码⽚段四、返回JSON五、HttpServletResponse设置状态码六、设置Header6.1 HttpServletResponse设置6.2 RequestMapping设置 一、返回页面 步骤如下&#xff1a; 我们先要在static目录下创建…...

计算机网络八股文--day4 --传输层TCP与UDP

这是面试中最常考到的一层&#xff1a;端到端&#xff08;也就是进程之间&#xff09;的透明数据传输服务&#xff0c;差错控制和流量控制 该层呈上启下&#xff0c;像上面的资源子网提高服务&#xff0c;并使用下面通信子网的服务 端口&#xff0c;用于唯一标识主机上进程的&…...

个人开发免费好用

聊一聊 现在输入法非常多&#xff0c;有时候都不知道哪个更好用。 其实&#xff0c;只有多尝试&#xff0c;才能找到适合自己的。 今天给大家分享一款输入法&#xff0c;用起来比较顺手&#xff0c;大家可以试试。 软件介绍 BL输入法 这是一款绿色纯净&#xff0c;安全放心…...

[随笔] 升级uniapp旧项目的vue、pinia、vite、dcloudio依赖包等

汇总 # 升级uniapp项目dcloudio整体依赖&#xff0c;建议执行多次 # 会顺带自动更新/升级vue的版本 npx dcloudio/uvmlatest alpha# 检查 pinia 的最新版本 npm view pinia version# 更新项目 pinia 到最新版本 npm update pinia# 更新项目 pinia 到特定的版本 # 首先&#xf…...

第十六届蓝桥杯 2025 C/C++组 密密摆放

目录 题目&#xff1a; 题目描述&#xff1a; 题目链接&#xff1a; 思路&#xff1a; 思路详解: 发个牢骚&#xff1a; 代码&#xff1a; 代码详解&#xff1a; 题目&#xff1a; 题目描述&#xff1a; 题目链接&#xff1a; P12337 [蓝桥杯 2025 省 AB/Python B 第二…...

【QT】QT中的网络编程(TCP 和 UDP通信)

QT中的网络编程&#xff08;TCP 和 UDP通信&#xff09; 1.tcp1.1 tcp通信1.1.1 相比linux中tcp通信:1.1.2 QT中的tcp通信: 1.2 tcp通信流程1.2.1 服务器流程&#xff1a;1.2.1.1 示例代码1.2.1.2 现象 1.2.2 客户端流程&#xff1a;1.2.2.1 示例代码1.2.2.2 现象&#xff1a; …...

Spring MVC @RequestBody 注解怎么用?接收什么格式的数据?

RequestBody 注解的作用 RequestBody 将方法上的参数绑定到 HTTP 请求的 Body&#xff08;请求体&#xff09;的内容上。 当客户端发送一个包含数据的请求体&#xff08;通常在 POST, PUT, PATCH 请求中&#xff09;时&#xff0c;RequestBody 告诉 Spring MVC 读取这个请求体…...

第38课 常用快捷操作——双击“鼠标左键”进入Properties Panel

概述 在设计过程中&#xff0c;我们经常需要更改某个图元的属性&#xff0c;例如更该焊盘的大小、更改网络的名称等等。 在AD 20中&#xff0c;更改属性一般都是在Properties Panel上完成的。 当我们要更改某个图元的属性时&#xff0c;我们用鼠标左键双击它&#xff0c;就可…...

【git】获取特定分支和所有分支

1 特定分支 1.1 克隆指定分支&#xff08;默认只下载该分支&#xff09; git clone -b <分支名> --single-branch <仓库URL> 示例&#xff08;克隆 某一个 分支&#xff09;&#xff1a; git clone -b xxxxxx --single-branch xxxxxxx -b &#xff1a;指定分支…...

从零开发一个B站视频数据统计Chrome插件

从零开发一个B站视频数据统计Chrome插件 前言 B站&#xff08;哔哩哔哩&#xff09;作为国内最大的弹幕视频网站之一&#xff0c;视频的播放量、点赞、投币、收藏等数据对于内容创作者和数据分析者来说非常重要。本文将带你一步步实现一个Chrome插件&#xff0c;自动统计并展…...

经典算法 石子合并问题

石子合并问题 问题描述 在一个园形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆&#xff0c;并将新的一堆的石子数&#xff0c;记为该次合并的得分。试设计出一个算法,计算出将N堆石子合并成1堆最大得分和最小得分。 输入描述…...

[stm32] 4-1 USART(1)

文章目录 前言4-2 USART与串口通信(1)USART简介什么是USART?USART名字的含义&#xff1f;如何使用USART&#xff1f; USART的工作原理什么是串并转换&#xff1f;为什么要进行串并转换&#xff1f;移位寄存器串并行转换电路 USART寄存器组和完整框图 前言 本笔记内容&#xff…...

智能家居的OneNet云平台

一、声明 该项目只需要创建一个产品&#xff0c;然后这个产品里面包含几个设备&#xff0c;而不是直接创建几个产品 注意&#xff1a;传输数据使用到了不同的power&#xff0c;还有一定要手机先联网才能使用云平台 二、OneNet云平台创建 &#xff08;1&#xff09;Temperatur…...

记录两个免费开源又好用的后台模版vue3

一.element-plus-admin 一套基于vue3、element-plus、typesScript、vite的后台集成方案 1.简介 vue-element-plus-admin 是一个基于 element-plus 免费开源的中后台模版。使用了最新的 Vue3&#xff0c;Vite&#xff0c;Typescript等主流技术开发&#xff0c;开箱即用的中后…...

【AI生产力工具】Windsurf,一款AI编程工具

Windsurf 是 Codeium 公司推出的一款 AI 编程助手,它是一款集成深度上下文感知、多模型协作和实时代码管理的综合开发环境(IDE)。 Windsurf 作为 AI 编程工具的核心价值在于 “上下文感知 + 多模型协作 + 自动化工作流”,其深度集成的智能体系统(如 Flows 和 Cascade)正…...

YOLOv11改进:利用RT-DETR主干网络PPHGNetV2助力轻量化目标检测

这里写自定义目录标题 YOLOv11改进&#xff1a;利用RT-DETR主干网络PPHGNetV2助力轻量化目标检测1. 介绍2. 引言3. 技术背景3.1 YOLOv11概述3.2 RT-DETR与PPHGNetV23.3 相关工作 4. 应用使用场景5. 详细代码实现5.1 环境准备5.2 PPHGNetV2主干网络实现5.3 YOLOv11与PPHGNetV2集…...

Android 端如何监控 ANR、Crash、OOM 等严重问题

在移动互联网时代,Android 应用已经成为我们生活中不可或缺的一部分。从社交聊天到在线购物,从娱乐消遣到办公学习,几乎每个人的手机里都装满了各式各样的应用。然而,作为开发者,咱们得面对一个残酷的现实:用户的耐心是有限的。如果一个应用频繁卡顿、闪退,甚至直接崩掉…...

Mybatisplus:一些常用功能

自动驼峰 mybatis-plus:configuration:# 开启驼峰命名规则&#xff0c;默认true开启map-underscore-to-camel-case: true# 控制台日志打印&#xff0c;便于查看SQLlog-impl: org.apache.ibatis.logging.stdout.StdOutImpl TableName 作用&#xff1a;表名注解&#xff0c;标识…...

oracle 批量查询每张表的数据量

在 Oracle 中批量查询每张表的数据量,可以通过以下两种方法实现。根据数据量大小和实时性要求选择适合的方案: 方法一:通过数据字典快速查询(推荐) 原理: 使用 USER_TABLES(当前用户的表)或 DBA_TABLES(所有表,需DBA权限)中的 NUM_ROWS 字段,该字段记录了表的行数…...

linux netlink实现用户态和内核态数据交互

1&#xff0c;内核态代码 #include <linux/module.h> #include <linux/netlink.h> #include <net/sock.h> #define NETLINK_TEST 31 struct sock *nl_sk NULL; static void nl_recv_msg(struct sk_buff *skb) { struct nlmsghdr *nlh; int pid; …...

java 洛谷题单【算法2-2】常见优化技巧

P1102 A-B 数对 解题思路 输入读取与初始化&#xff1a; 使用 Scanner 读取输入。n 表示数组的长度&#xff0c;c 表示目标差值。使用一个 HashMap 存储数组中每个数字及其出现的次数&#xff0c;方便快速查找。数组 a 用于存储输入的数字。 构建哈希映射&#xff1a; 遍历数…...

WebAPI项目从Newtonsoft.Json迁移到System.Text.Json踩坑备忘

1.控制器层方法返回类型不能为元组 控制器层方法返回类型为元组时&#xff0c;序列化结果为空。 因为元组没有属性只有field&#xff0c;除非使用IncludeFields参数专门指定&#xff0c;否则使用System.Text.Json进行序列化时不会序列化field var options new JsonSerializ…...

batch normalization和layer normalization区别

Normalization无非就是这样一个操作&#xff1a; 其中x是输入数据&#xff0c;维度为&#xff08;B&#xff0c;T&#xff0c;C&#xff09;&#xff0c;其中B是batchsize&#xff0c;T是序列长度&#xff0c;C是embedding维度&#xff1b;括号内是标准化操作&#xff0c;γ和…...