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

Tcp网络通信的基本流程梳理

先来一张经典的流程图

接下介绍一下大概流程,各个函数的参数大家自己去了解加深一下印象

服务端流程

 1.创建套接字:使用 socket 函数创建一个套接字,这个套接字后续会被用于监听客户端的连接请求。   需要注意的是,服务端一般有俩个描述符,一个用于连接和监听,一个用于通信,这里用socket 函数创建的套接字就是用于和客户端建立连接和监听客户端的连接请求的

例如在 C 语言中:

#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
#include <unistd.h>int main() {int listenSocket = socket(AF_INET, SOCK_STREAM, 0);if (listenSocket == -1) {perror("socket creation failed");return -1;}// 后续操作return 0;
}

2.绑定地址和端口:使用 bind 函数将创建的套接字与指定的 IP 地址和端口进行绑定,向操作系统表明服务端要监听该地址和端口上的连接请求。示例如下:

struct sockaddr_in serverAddr;
serverAddr.sin_family = AF_INET;
serverAddr.sin_addr.s_addr = INADDR_ANY; // 监听所有可用网络接口
serverAddr.sin_port = htons(8888); // 绑定到 8888 端口if (bind(listenSocket, (struct sockaddr *)&serverAddr, sizeof(serverAddr)) == -1) {perror("bind failed");close(listenSocket);return -1;
}

为什么bind绑定时一定要将套接字和服务器的ip和端口绑定在一起呢?我的理解是客户端相当于一个想入住酒店的旅客,套接字就相当于房卡,有了这张房卡旅客才能知道楼层和具体房间在哪里。

3.监听连接请求:使用 listen 函数将套接字设置为监听状态,指定最大允许的连接请求队列长度。

示例如下:

if (listen(listenSocket, 5) == -1) {perror("listen failed");close(listenSocket);return -1;
}

4.接受连接并创建新套接字:使用 accept 函数接受客户端的连接请求。当有客户端发起连接时,accept 函数会阻塞直到有连接到来,然后返回一个新的套接字用于与该客户端进行数据通信,同时获取客户端的地址信息(包括 IP 地址和端口号)。示例如下:

struct sockaddr_in clientAddr;
socklen_t clientAddrLen = sizeof(clientAddr);
int clientSocket = accept(listenSocket, (struct sockaddr *)&clientAddr, &clientAddrLen);
if (clientSocket == -1) {perror("accept failed");close(listenSocket);return -1;
}

客户端流程

1.创建套接字:同样使用 socket 函数创建一个套接字,用于与服务端建立连接和进行数据通信。示例如下:

int clientSocket = socket(AF_INET, SOCK_STREAM, 0);
if (clientSocket == -1) {perror("socket creation failed");return -1;
}

2.发起连接请求:使用 connect 函数向服务端发起连接请求,在 connect 函数中指定服务端的 IP 地址和端口号。示例如下:

struct sockaddr_in serverAddr;
serverAddr.sin_family = AF_INET;
serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); // 服务端 IP 地址
serverAddr.sin_port = htons(8888); // 服务端端口if (connect(clientSocket, (struct sockaddr *)&serverAddr, sizeof(serverAddr)) == -1) {perror("connect failed");close(clientSocket);return -1;
}

3.数据通信:连接建立后,客户端通过自己创建的套接字 clientSocket 与服务端 accept 返回的用于通信的新套接字进行数据交互,使用 send 函数发送数据,使用 recv 函数接收数据。

相关文章:

Tcp网络通信的基本流程梳理

先来一张经典的流程图 接下介绍一下大概流程&#xff0c;各个函数的参数大家自己去了解加深一下印象 服务端流程 1.创建套接字&#xff1a;使用 socket 函数创建一个套接字&#xff0c;这个套接字后续会被用于监听客户端的连接请求。 需要注意的是&#xff0c;服务端一般有俩…...

PHP函数缺陷详解

无问社区-官网&#xff1a;http://www.wwlib.cn 本期无人投稿&#xff0c;欢迎大家投稿&#xff0c;投稿可获得无问社区AI大模型的使用红包哦&#xff01; 无问社区&#xff1a;网安文章沉浸式免费看&#xff01; 无问AI大模型不懂的问题随意问&#xff01; 全网网安资源智…...

解决 Redis 后台持久化失败的问题:内存不足导致 fork 失败

文章目录 解决 Redis 后台持久化失败的问题&#xff1a;内存不足导致 fork 失败问题背景与成因解决方案修改内核参数 vm.overcommit_memory增加系统内存或 Swap 空间调整 Redis 配置 stop-writes-on-bgsave-error 在 Docker 环境中的注意事项总结 解决 Redis 后台持久化失败的问…...

深度学习GRU模型原理

一、介绍 门控循环单元&#xff08;Gated Recurrent Unit, GRU&#xff09; 是一种改进的循环神经网络&#xff08;RNN&#xff09;&#xff0c;专为解决传统RNN的长期依赖问题&#xff08;梯度消失/爆炸&#xff09;而设计。其核心是通过门控机制动态控制信息的流动。与LSTM相…...

网络空间安全(31)安全巡检

一、定义与目的 定义&#xff1a; 安全巡检是指由专业人员或特定部门负责&#xff0c;对各类设施、设备、环境等进行全面或重点检查&#xff0c;及时发现潜在的安全隐患或问题。 目的&#xff1a; 预防事故发生&#xff1a;通过定期的安全巡检&#xff0c;及时发现并解决潜在的…...

基于Python+SQLite实现(Web)验室设备管理系统

实验室设备管理系统 应用背景 为方便实验室进行设备管理&#xff0c;某大学拟开发实验室设备管理系统 来管理所有实验室里的各种设备。系统可实现管理员登录&#xff0c;查看现有的所有设备&#xff0c; 增加设备等功能。 开发环境 Mac OSPyCharm IDEPython3Flask&#xff…...

面试系列|蚂蚁金服技术面【2】

今天继续分享一下蚂蚁金服的 Java 后端开发岗位真实社招面经&#xff0c;复盘面试过程中踩过的坑&#xff0c;整理面试过程中提到的知识点&#xff0c;希望能给正在准备面试的你一些参考和启发&#xff0c;希望对你有帮助&#xff0c;愿你能够获得心仪的 offer ! 第一轮面试完…...

【JavaEE】网络原理之初识

1.❤️❤️前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; Hello, Hello~ 亲爱的朋友们&#x1f44b;&#x1f44b;&#xff0c;这里是E绵绵呀✍️✍️。 如果你喜欢这篇文章&#xff0c;请别吝啬你的点赞❤️❤️和收藏&#x1f4d6;&#x1f4d6;。如果你对我的…...

WorkTool 技术解析:企业微信自动化办公的合规实现方案

引言&#xff1a;企业微信生态中的自动化需求 随着企业微信用户规模突破4亿&#xff08;据腾讯2023年财报&#xff09;&#xff0c;其开放生态催生了自动化办公的技术需求。传统RPA&#xff08;机器人流程自动化&#xff09;工具在PC端已广泛应用&#xff0c;但移动端自动化仍…...

从0到1构建AI深度学习视频分析系统--基于YOLO 目标检测的动作序列检查系统:(2)消息队列与消息中间件

文章大纲 原始视频队列Python 内存视频缓存优化方案(4GB 以内)一、核心参数设计二、内存管理实现三、性能优化策略四、内存占用验证五、高级优化技巧六、部署建议检测结果队列YOLO检测结果队列技术方案一、技术选型矩阵二、核心实现代码三、性能优化策略四、可视化方案对比五…...

一文讲通锁标记对象std::adopt_lock盲点

一文讲通锁标记对象std::adopt_lock盲点 1. 核心概念2. 代码详解1. 单个锁2. 多重锁(可以用来预防死锁)3. 条件变量的互斥控制4. 复杂示例: 多生产者-多消费者模型(超纲了&#xff0c; 可不看&#xff0c;哈哈哈哈) 3. 小结 1. 核心概念 在C中&#xff0c; std::adopt_lock是一…...

Vscode工具开发Vue+ts项目时vue文件ts语法报错-红波浪线等

Vscode工具开发Vuets项目时vue文件ts语法报错-红波浪线等 解决方案 问题如题描述&#xff0c;主要原因是开发工具使用的代码检查与项目的中的ts不一致导导致&#xff0c;解决办法&#xff0c;修改 vscode 中&#xff0c; 快捷键&#xff1a;command shift p, 输入&#xff…...

Mac下安装Zed以及Zed对MCP(模型上下文协议)的支持

Zed是当前新流行的一种编辑器&#xff0c;支持MCP&#xff08;模型上下文协议&#xff09; Mac下安装Zed比较简单&#xff0c;直接有安装包&#xff0c;在这里&#xff1a; brew install --cask zedMac Monterey下是可以安装上的&#xff0c;亲测有效。 配置 使用CtrlShiftP…...

ROS实践(五)机器人自动导航(robot_navigation)

目录 一、知识点 1. 定位 2. 路径规划 (1)全局路径规划 (2)局部路径规划 3. 避障 二、常用工具和传感器 三、相关功能包 1. move_base(决策规划) 2. amcl(定位) 3. costmap_2d(代价地图) 4. global_planner(全局规划器) 5. local_planner(局部规划器…...

REDIS生产环境配置

REDIS生产环境配置 REDIS生产环境配置docker-compose文件redis.conf文件 REDIS生产环境配置 docker-compose模式部署生产环境 docker-compose文件 d_redis:image: redis:${REDIS_VERSION}container_name: d_redisvolumes:- ${REDIS_1_CONF_FILE}:/etc/redis.conf:ro- ${DATA_…...

【小沐学Web3D】three.js 加载三维模型(React)

文章目录 1、简介1.1 three.js1.2 react.js 2、three.js React结语 1、简介 1.1 three.js Three.js 是一款 webGL&#xff08;3D绘图标准&#xff09;引擎&#xff0c;可以运行于所有支持 webGL 的浏览器。Three.js 封装了 webGL 底层的 API &#xff0c;为我们提供了高级的…...

软考教材重点内容 信息安全工程师 第19章 操作系统安全保护

19.1.1 操作系统安全概念 一般来说&#xff0c;操作系统的安全是指满足安全策略要求&#xff0c;具有相应的安全机制及安全功能&#xff0c;符合特定的安全标准&#xff0c;在一定约束条件下&#xff0c;能够抵御常见的网络安全威胁&#xff0c;保障自身的安全运行及资源安全。…...

​【C++设计模式】第二十一篇:模板方法模式(Template Method)

注意&#xff1a;复现代码时&#xff0c;确保 VS2022 使用 C17/20 标准以支持现代特性。 算法骨架的标准化定义 1. 模式定义与用途 核心思想 ​模板方法模式&#xff1a;在父类中定义算法的骨架&#xff0c;将某些步骤延迟到子类实现&#xff0c;使得子类不改变算法结构即可…...

【机器学习】基于t-SNE的MNIST数据集可视化探索

一、前言 在机器学习和数据科学领域&#xff0c;高维数据的可视化是一个极具挑战但又至关重要的问题。高维数据难以直观地理解和分析&#xff0c;而有效的可视化方法能够帮助我们发现数据中的潜在结构、模式和关系。本文以经典的MNIST手写数字数据集为例&#xff0c;探讨如何利…...

【Pycharm】Pycharm无法复制粘贴,提示系统剪贴板不可用

我也没有用vim的插件&#xff0c;检查了本地和ubutnu上都没有。区别是我是远程到ubutnu的pycharm&#xff0c;我本地直接控制windowes的pycharm是没问题的。现象是可以从外部复制到pycharm反之则不行。 ctl c ctlv 以及右键 都不行 参考&#xff1a;Pycharm无法复制粘贴&…...

基于python+django+vue.js开发的医院门诊管理系统/医疗管理系统源码+运行

功能介绍 平台采用B/S结构&#xff0c;后端采用主流的Python语言进行开发&#xff0c;前端采用主流的Vue.js进行开发。源码 功能包括&#xff1a;医生管理、科室管理、护士管理、住院管理、药品管理、用户管理、日志管理、系统信息模块。 源码地址 https://github.com/geee…...

Spring Boot整合RabbitMQ极简教程

一、消息队列能解决什么问题&#xff1f; 异步处理&#xff1a;解耦耗时操作&#xff08;如发短信、日志记录&#xff09;流量削峰&#xff1a;应对突发请求&#xff0c;避免系统过载应用解耦&#xff1a;服务间通过消息通信&#xff0c;降低依赖 二、快速整合RabbitMQ 1. 环…...

Flink-学习路线

最近想学习一下Flink&#xff0c;公司的实时需求还是不少的&#xff0c;因此结合ai整理了一份学习路线&#xff0c;记录一下。 当然&#xff0c;公司也有Scala版本Flink框架&#xff0c;也学习了一下。这里只说Java版本 1. Java基础 目标: 掌握Java编程语言的基础知识。 内容…...

Atcoder ABC397-D 题解

https://atcoder.jp/contests/abc397/tasks/abc397_dhttps://atcoder.jp/contests/abc397/tasks/abc397_d 题目描述&#xff1a; 确定是否存在一对正整数,使得 思路&#xff1a; 首先对方程进行转化 设 即 接下来确定的范围 根据立方差公式 因此&#xff0c;我们可以从到来…...

K8S学习之基础二十七:k8s中daemonset控制器

k8s中DaemonSet控制器 ​ DaemonSet控制器确保k8s集群中&#xff0c;所有节点都运行一个相同的pod&#xff0c;当node节点增加时&#xff0c;新节点也会自动创建一个pod&#xff0c;当node节点从集群移除&#xff0c;对应的pod也会自动删除。删除DaemonSet也会删除创建的pod。…...

电机控制常见面试问题(八)

文章目录 一、解释什么是矢量控制及其优势二、 如何设计一个电机控制系统的开环和闭环控制&#xff1f;请给出具体案例三.如何通过软件模拟来优化电机控制设计四. 请解释电机过流保护过压保护过温保护等保护机制五.你熟悉哪些电机驱动拓扑结构六.解释空间适量脉宽调制的原理 一…...

保持docker内容器一直运行

首先&#xff1a;确保Docker服务配置为开机自启&#xff0c;这样当虚拟机启动时&#xff0c;Docker也会启动&#xff0c;并按照设定的重启策略自动启动相关容器。 sudo systemctl enable docker 创建容器时&#xff1a; 当你使用docker run命令启动容器时&#xff0c;可以添…...

神经网络的基本知识

感知机 输入&#xff1a;来自其他 n 个神经元传递过来的输入信号 处理&#xff1a;输入信号通过带权重的连接进行传递, 神经元接受到总输入值将与神经元的阈值进行比较 输出&#xff1a;通过激活函数的处理以得到输出 感知机由两层神经元组成, 输入层接受外界输入信号传递给…...

PostgreSQL技术内幕26:PG聚合算子实现分析

文章目录 0.简介1.概念说明2.朴素聚集3.Group by聚集3.1 哈希聚集3.2 分组聚集 0.简介 聚合算子在聚合函数在数据分析、报告生成和统计计算中扮演着重要角色&#xff0c;通过对多行数据进行计算&#xff0c;将多个输入值压缩为单一输出值&#xff0c;如求和、平均值、计数等。…...

【RS】OneRec快手-生成式推荐模型

note 本文提出了一种名为 OneRec 的统一生成式推荐框架&#xff0c;旨在替代传统的多阶段排序策略&#xff0c;通过一个端到端的生成模型直接生成推荐结果。OneRec 的主要贡献包括&#xff1a; 编码器-解码器结构&#xff1a;采用稀疏混合专家&#xff08;MoE&#xff09;架构…...