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

TCP协议详细讲解及C++代码实例

目录

  • 一. TCP协议详细讲解及C++代码实例
    • 1、TCP协议概述
    • 2、TCP通信流程
      • 1) 三次握手
      • 2) 数据传输
      • 3) 四次挥手
    • 3、关键点解析
      • 1) 套接字创建
      • 2) 三次握手实现
      • 3) 数据传输
      • 4) 四次挥手实现
    • 4、TCP与UDP对比

一. TCP协议详细讲解及C++代码实例

1、TCP协议概述

TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。其核心特性包括:

  • 面向连接:通信前需建立连接(三次握手),结束后需释放连接(四次挥手)。
  • 可靠性:通过序列号、确认应答(ACK)、超时重传、校验和等机制确保数据无丢失、无重复、按序到达。
  • 流量控制:使用滑动窗口机制,动态调整发送速率,避免接收方缓冲区溢出。
  • 拥塞控制:通过慢启动、拥塞避免、快速重传、快速恢复等算法避免网络拥塞。

2、TCP通信流程

1) 三次握手

客户端发送SYN包,服务器返回SYN+ACK包,客户端再发送ACK包,建立连接。

2) 数据传输

数据被分割为多个TCP段,每段包含序列号和确认号,确保按序传输。

3) 四次挥手

通信结束时,主动关闭方发送FIN包,被动关闭方返回ACK包,再发送FIN包,最后主动关闭方返回ACK包,释放连接。

C++代码实例

1. TCP客户端代码(C++)
cpp
#include <iostream>
#include <cstring>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>int main() {// 创建TCP套接字int client_socket = socket(AF_INET, SOCK_STREAM, 0);if (client_socket == -1) {std::cerr << "Failed to create socket." << std::endl;return -1;}// 设置服务器地址和端口sockaddr_in server_address{};server_address.sin_family = AF_INET;server_address.sin_port = htons(8888);server_address.sin_addr.s_addr = inet_addr("127.0.0.1");// 连接服务器if (connect(client_socket, (struct sockaddr*)&server_address, sizeof(server_address)) == -1) {std::cerr << "Failed to connect to server." << std::endl;close(client_socket);return -1;}try {// 发送数据const char* message = "Hello, TCP Server!";send(client_socket, message, strlen(message), 0);// 接收响应char buffer[1024] = {0};int bytes_received = recv(client_socket, buffer, sizeof(buffer), 0);if (bytes_received > 0) {std::cout << "Received from server: " << buffer << std::endl;}} catch (...) {std::cerr << "An error occurred during communication." << std::endl;}// 关闭连接close(client_socket);return 0;
}
2. TCP服务器端代码(C++)
cpp
#include <iostream>
#include <cstring>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>int main() {// 创建TCP套接字int server_socket = socket(AF_INET, SOCK_STREAM, 0);if (server_socket == -1) {std::cerr << "Failed to create socket." << std::endl;return -1;}// 绑定地址和端口sockaddr_in server_address{};server_address.sin_family = AF_INET;server_address.sin_port = htons(8888);server_address.sin_addr.s_addr = INADDR_ANY;if (bind(server_socket, (struct sockaddr*)&server_address, sizeof(server_address)) == -1) {std::cerr << "Failed to bind socket." << std::endl;close(server_socket);return -1;}// 监听连接if (listen(server_socket, 1) == -1) {std::cerr << "Failed to listen on socket." << std::endl;close(server_socket);return -1;}std::cout << "Server is listening on port 8888..." << std::endl;try {while (true) {// 接受客户端连接sockaddr_in client_address{};socklen_t client_address_size = sizeof(client_address);int client_socket = accept(server_socket, (struct sockaddr*)&client_address, &client_address_size);if (client_socket == -1) {std::cerr << "Failed to accept client connection." << std::endl;continue;}std::cout << "Connection from " << inet_ntoa(client_address.sin_addr) << std::endl;try {// 接收数据char buffer[1024] = {0};int bytes_received = recv(client_socket, buffer, sizeof(buffer), 0);if (bytes_received > 0) {std::cout << "Received from client: " << buffer << std::endl;// 发送响应const char* response = "Hello, TCP Client!";send(client_socket, response, strlen(response), 0);}} catch (...) {std::cerr << "An error occurred during communication." << std::endl;}// 关闭客户端连接close(client_socket);}} catch (...) {std::cerr << "An error occurred in the server loop." << std::endl;}// 关闭服务器套接字close(server_socket);return 0;
}

3、关键点解析

1) 套接字创建

socket(AF_INET, SOCK_STREAM, 0):创建IPv4的TCP套接字。

2) 三次握手实现

客户端调用connect()时,底层自动完成三次握手。

3) 数据传输

send():发送数据。
recv():接收数据,需指定缓冲区大小。

4) 四次挥手实现

关闭连接时,close()方法自动完成四次挥手。

4、TCP与UDP对比

特性TCPUDP
连接方式面向连接(三次握手)无连接
可靠性高(确认应答、重传等)低(不保证可靠传输)
传输效率较低(因可靠性机制)高(无额外开销)
适用场景文件传输、网页浏览等视频流、实时游戏等

六、总结
TCP协议通过面向连接、可靠性保障、流量控制和拥塞控制等机制,成为互联网数据传输的核心协议。上述代码示例展示了TCP客户端和服务端的完整交互流程,适用于需要可靠传输的场景。

相关文章:

TCP协议详细讲解及C++代码实例

目录 一. TCP协议详细讲解及C代码实例1、TCP协议概述2、TCP通信流程1&#xff09; 三次握手2) 数据传输3) 四次挥手 3、关键点解析1&#xff09; 套接字创建2&#xff09; 三次握手实现3&#xff09; 数据传输4&#xff09; 四次挥手实现 4、TCP与UDP对比 一. TCP协议详细讲解及…...

深度剖析:Vue2 项目兼容第三方库模块格式的终极解决方案

当我们为 Vue2 项目引入某些现代 JavaScript 库时&#xff0c;常常会遇到这样的报错&#xff1a; error in ./node_modules/some-lib/lib/index.mjs Cant import the named export xxx from non EcmaScript module这类问题的本质是模块格式的世纪之争 —— ES Module&#xff…...

APISQL免费版安装教程(视频)

APISQL 一款通用的API开发管理软件&#xff0c;支持将主流数据库中的表、视图、SQL语句、存储过程等快速封装为标准的 RESTful API&#xff0c;支持多种安全认证方式和可视化管理界面。适用于接口开发、系统集成、数据共享等场景。 支持主流数据库的表、视图、自定义函数、存储…...

SpringBoot整合MQTT实战:基于EMQX实现双向设备通信(附源码)

简言&#xff1a; 在万物互联的时代&#xff0c;MQTT协议凭借其轻量级、高效率的特性&#xff0c;已成为物联网通信的事实标准。本教程将带领您在Ubuntu系统上搭建EMQX 5.9.0消息服务器&#xff0c;并使用Spring Boot快速实现两个客户端的高效通信。通过本指南&#xff0c;您将…...

从零开始掌握FreeRTOS(2)链表之节点的定义

目录 节点 节点定义 节点实现 根节点 根节点定义 精简节点定义 根节点实现 在上篇文章,我们完成了 FreeRTOS 的移植。在创建任务之前,我们需要先了解FreeRTOS的运转机制。 FreeRTOS是一个多任务系统,由操作系统来管理执行每个任务。这些任务全都挂载到一个双向循…...

Java的While循环写的出票简单程序

import java.util.Scanner;public class Hello {public static void main(String[] args) {Scanner in new Scanner(System.in);int balance 0;while(true){System.out.print("请投币: ");int amount in.nextInt();balance balance amount;if(balance >10 )…...

详解Windows(十一)——网络连接设置

Windows网络连接设置完全指南 1. Windows网络连接基础 网络连接类型 有线连接&#xff1a; 通过网线将电脑连接到路由器或调制解调器优点&#xff1a;连接稳定&#xff0c;速度快&#xff0c;延迟低适合&#xff1a;需要高速稳定网络的场景&#xff0c;如游戏、大文件下载、…...

多线程爬虫语言选择与实现

之前文中有人提到&#xff1a;想要一个简单易用、能快速实现多线程爬虫的方案&#xff0c;而且目标是小网站&#xff0c;基本可以确定对反爬虫措施要求不高&#xff0c;这些就比较简单了。 以往我肯定要考虑常见的编程语言中哪些适合爬虫。Python、JavaScript&#xff08;Node…...

【数据结构】——双向链表

一、链表的分类 我们前面学习了单链表&#xff0c;其是我们链表中的其中一种&#xff0c;我们前面的单链表其实全称是单向无头不循环链表&#xff0c;我们的链表从三个维度进行分类&#xff0c;一共分为八种。 1、单向和双向 可以看到第一个链表&#xff0c;其只能找到其后一个…...

AI助力:零基础开启编程之旅

一、代码调试 三步解决BUG 1. 错误信息翻译 指令模板&#xff1a; 错误诊断模式我遇到【编程语言】报错“粘贴报错信息“ 请&#xff1a; 用小白能懂的话解释问题本质标注可能引发该错误的三个场景给出最可能的修复方案和其他备选方案 2. 上下文分析 进阶指令 结合上下文代…...

mybatis中${}和#{}的区别

先测试&#xff0c;再说结论 userService.selectStudentByClssIds(10000, "wzh or 11");List<StudentEntity> selectStudentByClssIds(Param("stuId") int stuId, Param("field") String field);<select id"selectStudentByClssI…...

【计算机组成原理】第二部分 存储器--分类、层次结构

文章目录 分类&层次结构0x01 分类按存储介质分类按存取方式分类按在计算机中的作用分类 0x02 层次结构 分类&层次结构 0x01 分类 按存储介质分类 半导体存储器磁表面存储器磁芯存储器光盘存储器 按存取方式分类 存取时间与物理地址无关&#xff08;随机访问&#…...

抗量子计算攻击的数据安全体系构建:从理论突破到工程实践

在“端 - 边 - 云”三级智能协同理论中&#xff0c;端 - 边、边 - 云之间要进行数据传输&#xff0c;网络的安全尤为重要&#xff0c;为了实现系统总体的安全可控&#xff0c;将构建安全网络。 可先了解我的前文&#xff1a;“端 - 边 - 云”三级智能协同平台的理论建构与技术实…...

正则表达式: 从基础到进阶的语法指南

正则表达式语法详解 前言一、基础概念二、基础元字符2.1 字符匹配2.2 字符类2.3 预定义字符类 三、重复匹配3.1 贪婪与非贪婪匹配3.2 精确重复匹配 四、边界匹配4.1 行首与行尾匹配4.2 单词边界匹配 五、分组与引用5.1 分组5.2 反向引用5.3 命名分组 六、逻辑运算符6.1 或运算 …...

uniapp|实现手机通讯录、首字母快捷导航功能、多端兼容(H5、微信小程序、APP)

基于uniapp实现带首字母快捷导航的通讯录功能,通过拼音转换库实现汉字姓名首字母提取与分类,结合uniapp的scroll-view组件与pageScrollTo API完成滚动定位交互,并引入uni-indexed-list插件优化索引栏性能。 目录 核心功能实现动态索引栏生成​联系人列表渲染​滚动定位联动性…...

【Linux】基础IO(二)

&#x1f4dd;前言&#xff1a; 上篇文章我们对Linux的基础IO有了一定的了解&#xff0c;这篇文章我们来讲讲IO更底层的东西&#xff1a; 重定向及其原理感受file_operation文件缓冲区 &#x1f3ac;个人简介&#xff1a;努力学习ing &#x1f4cb;个人专栏&#xff1a;Linux…...

SpringBoot异步处理@Async深度解析:从基础到高阶实战

一、异步编程基础概念 1.1 同步 vs 异步 特性同步异步执行方式顺序执行&#xff0c;阻塞调用非阻塞&#xff0c;调用后立即返回线程使用单线程完成所有任务多线程并行处理响应性较差&#xff0c;需等待前任务完成较好&#xff0c;可立即响应新请求复杂度简单直观较复杂&#…...

【生存技能】ubuntu 24.04 如何pip install

目录 原因解决方案说明关于忽略系统路径 在接手一个新项目需要安装python库时弹出了以下提示: 原因 这个报错是因为在ubuntu中尝试直接使用 pip 安装 Python 包到系统环境中&#xff0c;ubuntu 系统 出于稳定性考虑禁止了这种操作 这里的kali是因为这台机器的用户起名叫kali…...

SHAP分析!Transformer-GRU组合模型SHAP分析,模型可解释不在发愁!

SHAP分析&#xff01;Transformer-GRU组合模型SHAP分析&#xff0c;模型可解释不在发愁&#xff01; 目录 SHAP分析&#xff01;Transformer-GRU组合模型SHAP分析&#xff0c;模型可解释不在发愁&#xff01;效果一览基本介绍程序设计参考资料 效果一览 基本介绍 基于SHAP分析…...

Tcp 通信简单demo思路

Server 端 -------------------------- 初始化部分 ------------------------------- 1.创建监听套接字&#xff1a; 使用socket(协议家族&#xff0c;套接字的类型&#xff0c;0) 套接字类型有 SOCK_STREAM&#xff1a;表示面向连接的套接字&#xff08;Tcp协议&#xff09;&…...

MySQL 8.0安装(压缩包方式)

MySQL 8.0安装(压缩包方式) 下载安装包并解压 下载 https://dev.mysql.com/downloads/mysql/可关注“后端码匠”回复“MySQL8”关键字获取 解压&#xff08;我解压到D:\dev\mysql-8.4.5-winx64目录下&#xff09; 创建mysql服务 注意&#xff0c;这步之前一定要保证自己电…...

常见标签语言的对比

XML、JSON 和 YAML 是常见的数据序列化格式 相同点 结构化数据表示 三者均支持嵌套结构&#xff0c;能描述复杂的数据层级关系&#xff08;如对象、数组、键值对&#xff09;。跨平台兼容性 均为纯文本格式&#xff0c;可被多种编程语言解析&#xff0c;适用于跨系统数据交换…...

知名人工智能AI培训公开课内训课程培训师培训老师专家咨询顾问唐兴通AI在金融零售制造业医药服务业创新实践应用

AI赋能未来工作&#xff1a;引爆效率与价值创造的实战营 AI驱动的工作革命&#xff1a;从效率提升到价值共创 培训时长&#xff1a; 本课程不仅是AI工具的操作指南&#xff0c;更是面向未来的工作方式升级罗盘。旨在帮助学员系统掌握AI&#xff08;特别是生成式AI/大语言模型…...

Qt Creator 配置 Android 编译环境

Qt Creator 配置 Android 编译环境 环境配置流程下载JDK修改Qt Creator默认android配置文件修改sdk_definitions.json配置修改的内容 Qt Creator配置 异常处理删除提示占用编译报错连接安卓机调试APP闪退 环境 Qt Creator 版本 qtcreator-16.0.1Win10 嗯, Qt这个开发环境有点难…...

智能手表蓝牙 GATT 通讯协议文档

以下是一份适用于智能手表的 蓝牙 GATT 通讯协议文档&#xff0c;适用于 BLE 5.0 及以上标准&#xff0c;兼容 iOS / Android 平台&#xff1a; 智能手表蓝牙 GATT 通讯协议文档 文档版本&#xff1a;V1.0 编写日期&#xff1a;2025年xx月xx日 产品型号&#xff1a;Aurora Wat…...

AWS EC2源代码安装valkey命令行客户端

sudo yum -y install openssl-devel gcc wget https://github.com/valkey-io/valkey/archive/refs/tags/8.1.1.tar.gz tar xvzf 8.1.1.tar.gz cd valkey-8.1.1/ make distclean make valkey-cli BUILD_TLSyes参考 Connecting to nodes...

RT-THREAD RTC组件中Alarm功能驱动完善

使用Rt-Thread的目的为了更快的搭载工程&#xff0c;使用Rt-Thread丰富的组件和第三方包资源&#xff0c;解耦硬件&#xff0c;在更换芯片时可以移植应用层代码。你是要RTT的目的什么呢&#xff1f; 文章项目背景 以STM32L475RCT6为例 RTC使用的为LSE外部低速32 .756k Hz 的…...

MySQL解决主从复制的报错问题

MySQL 8.4 非 GTID 模式部分数据库主从复制指南 在进行MySQL 8.4非GTID模式下部分数据库主从复制时&#xff0c;以下是详细的操作步骤以及对应的执行位置说明&#xff0c;还有报错处理方法介绍&#xff1a; 操作步骤 1. 备份主库指定数据库&#xff08;db1、db2&#xff09;…...

用ffmpeg压缩视频参数建议

注意:代码中的斜杠\可以删除 一、基础压缩命令&#xff08;画质优先) libx265​​推荐配置 ffmpeg -i input.mp4 -c:v libx265 -crf 25 -preset medium -c:a aac -b:a 128k output.mp4-crf&#xff1a;建议25-28&#xff08;值越小画质越高&#xff09; -preset&#xff1a;平…...

输入顶点坐标输出立方体长宽高的神经网络 Snipaste贴图软件安装

写一个神经网络&#xff0c;我输入立方体投影线段的三视图坐标&#xff0c;输出分类和长宽高 放这了明天接着搞 -------------------------------------------- 开搞 然而我的数据是这样的 winget install Snipaste f1启动&#xff0c;双击贴图隐藏 用右边4个数据做输入…...