三次握手,四次挥手,服务器模型(多进程并发,线程),基于套接字的UDP通信

三次握手:

在这里插入图片描述

	第一次握手:客户端向服务器发送SYN待确认数据x, 客户端进入SYN_SEND状态

​	第二次握手:服务器向客户端回传一条ACK应答数据x+1, 同时发送一条SYN待确认数据y,服务器进入SYN_RECV状态

​	第三次握手:客户端向服务器回传一条ACK应答数据y+1,客户端和服务器同时进入ESTABLISHED状态

四次挥手:
在这里插入图片描述

第一次挥手:主动方向被动方发送FIN断开连接请求(FIN   x)

第二次挥手:被动方向主动方回传一条ACK应答(ACK  x+1)

第三次挥手:被动方向主动方发送FIN断开连接请求(FIN   y)

第四次挥手:主动方向被动方回传一条ACK应答(ACK  y+1)   

注意:当服务器作为主动方断开连接时,在第四次挥手过程中会有一个等待过程(TIME_WAIT),等待时间因操作系统不定

netstat -p | grep “6666”

二、服务器模型

1、循环服务器
int fd = socket();
bind();
listen();
while(1)
{
    int connfd = accept();
    while(1)
    {
		//发送或者接收
    }
    close(connfd);
}
close(sockfd);
2、并发服务器

(1)多线程并发服务器

注意:如果在多线程并发服务器中出现公共数据访问时,需要使用同步或者互斥进行资源保护

pthread_t thread;
int fd = socket();
bind();
listen();
while(1)
{
    int connfd = accept();
    pthread_create(&thread, NULL, thread_handler, (void *)connfd);    
    pthread_detach(thread);  //将线程设置为分离属性,属于非阻塞操作,当线程结束后,资源自动回收
}
close(sockfd);


void *thread_handler(void *arg)
{
    int connfd = (int *)arg;
    while(1)
    {
		//发送或者接收 connfd
        send(connfd, buf, 64, 0);        
    }  
    close(connfd);
}

(2)多进程并发服务器

注意:使用多进程并发服务器需要注意子进程资源回收的问题

17对应的信号是 SIGCHLD,SIGCHLD 信号是在子进程状态发生改变(如子进程终止、暂停或恢复)时,由操作系统发送给父进程的信号

pid_t pid;
int fd = socket();
bind();
listen();
signal(17, signal_handler);
signal 函数会告知操作系统,当进程接收到 SIGCHLD 信号时,
要调用 signal_handler 函数进行处理
//当进程接收到 SIGCHLD 信号(信号编号为 17)时
,会调用 signal_handler 函数来处理该信号

while(1)
{
    int connfd = accept();   //父进程执行
    pid = fork()   
    if(pid == 0)  //子进程执行
    {
       	//close(sockfd);
        while(1)
        {
            //发送或者接收
        }  
        close(connfd);
    } 
}
close(sockfd);

void signal_handler(int num)  //信号处理函数  num表示捕获信号的编号
{
    wait(NULL);
}

当父进程接收到 SIGCHLD 信号时,会调用 signal_handler 函数,该函数使用 wait(NULL) 来回收子进程的资源,避免子进程成为僵尸进程

三、基于套接字的UDP通信

特点:无连接、是一种不安全可靠,不能保证数据传输准确无误的一种通信方式

通信流程:

客户端:
    socket() --> sendto()/recvfrom() --> close()
    
服务器:
    socket() --> bind() --> sendto()/recvfrom() --> close()
1、发送/接收函数
       #include <sys/types.h>
       #include <sys/socket.h>


       ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
                      const struct sockaddr *dest_addr, socklen_t addrlen);
		参数:
            sockfd:数据报套接字
            buf:发送内容的首地址
            len:请求发送的字节数
            flags: 0
            dest_addr: 接收方地址结构的首地址
            addrlen:接收方地址结构的长度
        返回值: 
			返回成功发送的字节数

       ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
                        struct sockaddr *src_addr, socklen_t *addrlen);
		参数:
            sockfd:数据报套接字
            buf:存放接收内容的首地址
            len:请求接收的字节数
            flags: 0
            src_addr: 发送方地址结构的首地址
            addrlen:发送方地址结构长度的地址 
         返回值:
             返回成功接收的字节数
                
                
       发送数据实例:
             struct sockaddr_in saddr;
			 saddr.sin_family = AF_INET;
			 saddr.sin_port = htons(8888);
		     saddr.sin_addr.s_addr = inet_addr("192.168.6.48");
			  
             int s_len = sizeof(saddr);
             sendto(sockfd, "hello", 5, 0, (strcut sockaddr *)&saddr, s_len);

	

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PostgreSQL的学习心得和知识总结(一百六十七)|深入理解PostgreSQL数据库之静态语法检查工具PgSanity的使用和实现

目录结构 注:提前言明 本文借鉴了以下博主、书籍或网站的内容,其列表如下: 1、参考书籍:《PostgreSQL数据库内核分析》 2、参考书籍:《数据库事务处理的艺术:事务管理与并发控制》 3、PostgreSQL数据库仓库链接,点击前往 4、日本著名PostgreSQL数据库专家 铃木启修 网站…

【数据结构】双向链表(真正的零基础)

链表是一种物理存储单元上非连续、非顺序的存储结构。数据元素的逻辑顺序是通过指针的链接来实现的&#xff01;在上篇我们学习了单向链表&#xff0c;而单向链表虽然空间利用率高&#xff0c;插入和删除也只需改变指针就可以达到&#xff01;但是我们在每次查找、删除、访问..…

Docker 之mysql从头开始——Docker下mysql安装、启动、配置、进入容器执行(查询)sql

一、Docker 之mysql安装配置 步骤一&#xff1a;拉取镜像 1. 查看是否包含已安装的mysql。 docker images | grep mysql 2. 如上图所示&#xff0c;我们有mysql镜像&#xff0c;所以不必对mysql镜像进行拉取&#xff0c;如若没有上图中的惊喜&#xff0c;使用如下命令进行拉取…

网易日常实习一面面经

1. 自我介绍 2. 两道代码题&#xff1a; 第一道题&#xff1a;写一道链表排序题要求空间复杂度O(1) &#xff1a;已ac 插入排序算法 时间复杂度 O(N^2)&#xff0c;空间复杂度O(1) class ListNode{int val;ListNode next;public ListNode(int x) {this.val x;} } public cl…

DeepSeek LLM 论文解读:相信长期主义开源理念可扩展大语言模型(DeepSeek 吹响通用人工智能的号角)

论文链接&#xff1a;DeepSeek LLM: Scaling Open-Source Language Models with Longtermism&#xff08;相信长期主义开源理念可扩展大语言模型&#xff09; 目录 摘要一、数据处理&#xff08;一&#xff09;数据清洗与丰富&#xff08;二&#xff09;分词器与词汇设置 二、模…

02DevOps基础环境准备

准备两台Linux的操作系统&#xff0c;最简单的方式就是在本机上使用虚拟机搭建两个操作系统&#xff08;实际生产环境是两台服务器&#xff0c;虚拟机的方式用于学习使用&#xff09; 我搭建的两台服务器的ip分别是192.168.1.10、192.168.1.11 192.168.1.10服务器用于安装doc…

基于 SpringBoot 和 Vue 的智能腰带健康监测数据可视化平台开发(文末联系,整套资料提供)

基于 SpringBoot 和 Vue 的智能腰带健康监测数据可视化平台开发 一、系统介绍 随着人们生活水平的提高和健康意识的增强&#xff0c;智能健康监测设备越来越受到关注。智能腰带作为一种新型的健康监测设备&#xff0c;能够实时采集用户的腰部健康数据&#xff0c;如姿势、运动…

表单与交互:HTML表单标签全面解析

目录 前言 一.HTML表单的基本结构 基本结构 示例 二.常用表单控件 文本输入框 选择控件 文件上传 按钮 综合案例 三.标签的作用 四.注意事项 前言 HTML&#xff08;超文本标记语言&#xff09;是构建网页的基础&#xff0c;其中表单&#xff08;<form>&…

vue3中使用print-js组件实现打印操作

第一步&#xff1a;安装依赖 yarn add print-js 第二步&#xff1a;创建打印组件&#xff1a;PrintHtmlComp.vue <template><div id"printArea_123456789"><!-- 默认插槽&#xff0c;传入打印内容 --><slot></slot></div>…

【计算机网络】TCP/IP 网络模型有哪几层?

目录 应用层 传输层 网络层 网络接口层 总结 为什么要有 TCP/IP 网络模型&#xff1f; 对于同一台设备上的进程间通信&#xff0c;有很多种方式&#xff0c;比如有管道、消息队列、共享内存、信号等方式&#xff0c;而对于不同设备上的进程间通信&#xff0c;就需要网络通…

网络工程师 (29)CSMA/CD协议

前言 CSMA/CD协议&#xff0c;即载波监听多路访问/碰撞检测&#xff08;Carrier Sense Multiple Access with Collision Detection&#xff09;协议&#xff0c;是一种在计算机网络中&#xff0c;特别是在以太网环境下&#xff0c;用于管理多个设备共享同一物理传输介质的重要…

基于Python的人工智能驱动基因组变异算法:设计与应用(下)

3.3.2 数据清洗与预处理 在基因组变异分析中,原始数据往往包含各种噪声和不完整信息,数据清洗与预处理是确保分析结果准确性和可靠性的关键步骤。通过 Python 的相关库和工具,可以有效地去除噪声、填补缺失值、标准化数据等,为后续的分析提供高质量的数据基础。 在基因组…

AI大语言模型

一、AIGC和生成式AI的概念 1-1、AIGC Al Generated Content&#xff1a;AI生成内容 1-2、生成式AI&#xff1a;generative ai AIGC是生成式 AI 技术在内容创作领域的具体应用成果。 目前有许多知名的生成式 AI&#xff1a; 文本生成领域 OpenAI GPT 系列百度文心一言阿里通…

在postman中设置环境变量和全局变量以及五大常用响应体断言

一、什么是环境变量和全局变量 环境变量&#xff08;Environment Variables&#xff09;和全局变量&#xff08;Global Variables&#xff09;是 Postman 中用于存储和管理数据的两种变量类型&#xff0c;它们可以提高 API 测试的灵活性和可维护性。 1、 环境变量&#xff08…

Redis数据库(二):Redis 常用的五种数据结构

Redis 能够做到高性能的原因主要有两个&#xff0c;一是它本身是内存型数据库&#xff0c;二是采用了多种适用于不同场景的底层数据结构。 Redis 常用的数据结构支持字符串、列表、哈希表、集合和有序集合。实现这些数据结构的底层数据结构有 6 种&#xff0c;分别是简单动态字…

C++STL(六)——list模拟

目录 本次所需实现的三个类一、结点类的模拟实现构造函数 二、迭代器类的模拟实现为什么有迭代器类迭代器类的模板参数说明构造函数运算符的重载- -运算符的重载和!运算符的重载*运算符的重载->运算符的重载引入模板第二个和第三个参数 三、list的模拟实现3.1 默认成员函数构…

国产编辑器EverEdit - 替换功能详解

1 替换 1.1 应用场景 替换文本是在文档编辑过程中不可回避的操作&#xff0c;是将指定的关键词替换为新的文本&#xff0c;比如&#xff1a;写代码时修改变量名等。 1.2 使用方法 1.2.1 基本替换 使用主菜单查找 -> 替换&#xff0c;或使用快捷键Ctrl H&#xff0c;会打…

LIMO:上海交大的工作 “少即是多” LLM 推理

25年2月来自上海交大、SII 和 GAIR 的论文“LIMO: Less is More for Reasoning”。 一个挑战是在大语言模型&#xff08;LLM&#xff09;中的复杂推理。虽然传统观点认为复杂的推理任务需要大量的训练数据&#xff08;通常超过 100,000 个示例&#xff09;&#xff0c;但本文展…

防御保护作业二

拓扑图 需求 需求一&#xff1a; 需求二&#xff1a; 需求三&#xff1a; 需求四&#xff1a; 需求五&#xff1a; 需求六&#xff1a; 需求七&#xff1a; 需求分析 1.按照要求进行设备IP地址的配置 2.在FW上开启DHCP功能&#xff0c;并配置不同的全局地址池&#xff0c;为…

蓝桥与力扣刷题(226 翻转二叉树)

题目&#xff1a;给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1]示例 2&#xff1a; 输入&#xff1a;root [2,1,3] 输出&#xff1a;[2,…