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

news2025/2/11 4:48:36

三次握手:

在这里插入图片描述

	第一次握手:客户端向服务器发送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);

	

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

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

相关文章

Linux TCP 编程详解与实例

一、引言 在网络编程的领域中&#xff0c;TCP&#xff08;Transmission Control Protocol&#xff09;协议因其可靠的数据传输特性而被广泛应用。在 Linux 环境下&#xff0c;使用 C 或 C 进行 TCP 编程可以实现各种强大的网络应用。本文将深入探讨 Linux TCP 编程的各个方面&…

Elasticsearch 开放推理 API 增加了 Azure AI Studio 支持

作者&#xff1a;来自 Elastic Mark Hoy Elasticsearch 开放推理 API 现已支持 Azure AI Studio。在此博客中了解如何将 Azure AI Studio 功能与 Elasticsearch 结合使用。 作为我们持续致力于为 Microsoft Azure 开发人员提供他们选择的工具的一部分&#xff0c;我们很高兴地宣…

提示工程:少样本提示(Few-shot Prompting)

少样本提示&#xff08;Few-shot Prompting&#xff09;是一种利用大语言模型从少量示例样本中学习并处理任务的方法。它的核心思想是利用大语言模型的上下文学习能力&#xff0c;通过在提示中增加“示例样本”来启发大语言模型达到举一反三的效果。这种方法避免了重新训练或者…

封装descriptions组件,描述,灵活

效果 1、组件1&#xff0c;dade-descriptions.vue <template><table><tbody><slot></slot></tbody> </table> </template><script> </script><style scoped>table {width: 100%;border-collapse: coll…

数据中台是什么?:架构演进、业务整合、方向演进

文章目录 1. 引言2. 数据中台的概念与沿革2.1 概念定义2.2 历史沿革 3. 数据中台的架构组成与关键技术要素解析3.1 架构组成3.2 关键技术要素 4. 数据中台与其他平台的对比详细解析 5. 综合案例&#xff1a;金融行业数据中台落地实践5.1 背景5.2 解决方案5.3 成果与价值 6. 方向…

【Matlab优化算法-第14期】基于智能优化算法的VMD信号去噪项目实践

基于智能优化算法的VMD信号去噪项目实践 一、前言 在信号处理领域&#xff0c;噪声去除是一个关键问题&#xff0c;尤其是在处理含有高斯白噪声的复杂信号时。变分模态分解&#xff08;VMD&#xff09;作为一种新兴的信号分解方法&#xff0c;因其能够自适应地分解信号而受到…

ubuntu20使用tigervnc远程桌面配置记录

一、安装tigervnc sudo apt install tigervnc-common sudo apt install tigervnc-standalone-server二、增加配置文件 安装完后新增配置文件&#xff1a;vim ~/.vnc/xstartup #!/bin/sh #Uncomment the following two lines for normal desktop: #unset SESSION_MANAGER #ex…

【WB 深度学习实验管理】使用 PyTorch Lightning 实现高效的图像分类实验跟踪

本文使用到的 Jupyter Notebook 可在GitHub仓库002文件夹找到&#xff0c;别忘了给仓库点个小心心~~~ https://github.com/LFF8888/FF-Studio-Resources 在机器学习项目中&#xff0c;实验跟踪和结果可视化是至关重要的环节。无论是调整超参数、优化模型架构&#xff0c;还是监…

编译spring 6.2.2

如何编译Spring 6.2.2 下载spring 6.2.2 首先&#xff0c;下载spring 6.2.2&#xff0c;地址&#xff1a;下载 解压到你的目录下。 下载gradle 下载gradle&#xff0c;这是spring项目的依赖管理工具&#xff0c;本文下载的是8.12.1。 gradle idea配置如下&#xff1a;在你的…

【centOS】搭建公司内网git环境-GitLab 社区版(GitLab CE)

1. 安装必要的依赖 以 CentOS 7 系统为例&#xff0c;安装必要的依赖包&#xff1a; sudo yum install -y curl policycoreutils openssh-server openssh-clients postfix sudo systemctl start postfix sudo systemctl enable postfix2. 添加 GitLab 仓库 curl -sS https:/…

【R语言】plyr包和dplyr包

一、plyr包 plyr扩展包主要是实现数据处理中的“分割-应用-组合”&#xff08;split-apply-combine&#xff09;策略。此策略是指将一个问题分割成更容易操作的部分&#xff0c;再对每一部分进行独立的操作&#xff0c;最后将各部分的操作结果组合起来。 plyr扩展包中的主要函…

《XSS跨站脚本攻击》

一、XSS简介 XSS全称&#xff08;Cross Site Scripting&#xff09;跨站脚本攻击&#xff0c;为了避免和CSS层叠样式表名称冲突&#xff0c;所以改为了XSS&#xff0c;是最常见的Web应用程序安全漏洞之一&#xff0c;位于OWASP top 10 2013/2017年度分别为第三名和第七名&…

Golang:精通sync/atomic 包的Atomic 操作

在本指南中&#xff0c;我们将探索sync/atomic包的细节&#xff0c;展示如何编写更安全、更高效的并发代码。无论你是经验丰富的Gopher还是刚刚起步&#xff0c;你都会发现有价值的见解来提升Go编程技能。让我们一起开启原子运算的力量吧&#xff01; 理解Go中的原子操作 在快…

代码随想录_二叉树

二叉树 二叉树的递归遍历 144.二叉树的前序遍历145.二叉树的后序遍历94.二叉树的中序遍历 // 前序遍历递归LC144_二叉树的前序遍历 class Solution {public List<Integer> preorderTraversal(TreeNode root) {List<Integer> result new ArrayList<Integer&g…

【C语言标准库函数】浮点数分解与构造: frexp() 和 ldexp()

目录 一、头文件 二、函数简介 2.1. frexp(double x, int *exp) 2.2. ldexp(double x, int exp) 三、函数实现&#xff08;概念性&#xff09; 3.1. frexp 的概念性实现 3.2. ldexp 的概念性实现 四、注意事项 五、示例代码 在C语言标准库中&#xff0c;frexp() 和 ld…

【Git】tortoisegit使用配置

1. 安装 首先下载小乌龟&#xff0c;下载地址:https://tortoisegit.org/download/, 可以顺便下载语言包&#xff01; 安装时&#xff0c;默认安装就可以&#xff0c;一路next。也可以安装到指定目录中 目前已完成本地安装&#xff0c;接下来就需要与远程仓库建立连接&…

Spring基于文心一言API使用的大模型

有时做项目我们可能会遇到要在项目中对接AI大模型 本篇文章是对使用文心一言大模型的使用总结 前置任务 在百度智能云开放平台中注册成为开发者 百度智能云开放平台 进入百度智能云官网进行登录&#xff0c;点击立即体验 点击千帆大模型平台 向下滑动&#xff0c;进入到模型…

Centos Ollama + Deepseek-r1+Chatbox运行环境搭建

Centos Ollama Deepseek-r1Chatbox运行环境搭建 内容介绍下载ollama在Ollama运行DeepSeek-r1模型使用chatbox连接ollama api 内容介绍 你好&#xff01; 这篇文章简单讲述一下如何在linux环境搭建 Ollama Deepseek-r1。并在本地安装的Chatbox中进行远程调用 下载ollama 登…

SpringSecurity:授权服务器与客户端应用(入门案例)

文章目录 一、需求概述二、开发授权服务器1、pom依赖2、yml配置3、启动服务端 三、开发客户端应用1、pom依赖2、yml配置3、SecurityConfig4、接口5、测试 一、需求概述 maven需要3.6.0以上版本 二、开发授权服务器 1、pom依赖 <dependency><groupId>org.springfr…

Python与java的区别

一开始接触Python的时候&#xff0c;哔哩视频铺天盖地&#xff0c;看了很多人主讲的&#xff0c;要找适合自己口味的&#xff0c;各种培训机构喜欢在各种平台引流打广告&#xff0c;看了很多家&#xff0c;要么就是一个视频几个小时&#xff0c;长篇大论不讲原理只讲应用&#…