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

news2025/5/6 1:11:04

目录

一、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"则退出循环,结束程序。

运行结果:

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

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

相关文章

一篇撸清 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; …

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

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

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

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

[stm32] 4-1 USART(1)

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

记录两个免费开源又好用的后台模版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)正…

Mybatisplus:一些常用功能

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

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;γ和…

【多线程】七、POSIX信号量 环形队列的生产者消费者模型

文章目录 Ⅰ. 信号量一、POSIX 信号量的概念二、POSIX 信号量的类型区别三、POSIX 信号量与 SystemV 信号量的区别Ⅱ. 线程信号量基本原理一、为什么要引入信号量❓二、PV 操作三、POSIX 信号量的实现原理四、CAS操作介绍Ⅲ. POSIX未命名信号量接口一、初始化无名信号量二、销毁…

JVM 一文详解

目录 JVM 简介 JVM 中的内存区域划分 1. 堆&#xff08;一个进程只有一份 ------ 线程共享&#xff09; 2. 栈&#xff08;一个进程可以有 N 份 ------ 线程私有&#xff09; Java 虚拟机栈&#xff1a; 本机方法栈&#xff1a; 3. 程序计数器&#xff08;一个线程可以…

代码随想录算法训练营第60期第二十二天打卡

大家好&#xff01;我们今天来到了一个全新的章节&#xff0c;回溯算法&#xff0c;那究竟什么是回溯算法&#xff0c;我们应该如何理解回溯算法&#xff0c;以及回溯算法可以解决的题目&#xff0c;我们今天就来一探究竟。 第一部分 回溯算法理论基础 其实我可以告诉大家的是…