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

计算机网络开发(2)TCP\UDP区别、TCP通信框架、服务端客户端通信实例

TCP与UDP区别

  • UDP:用户数据报协议,面向无连接,可以单播,多播,广播, 面向数据报,不可靠
  • TCP:传输控制协议,面向连接的,可靠的,基于字节流,仅支持单播传输

在这里插入图片描述

socket通信

是对网络中不同主机上的应用程序进程之间进行双向通信端点的抽象

字节序

**小端字节序:**低位存在内存的低位
大端字节序:低位存在内存的高位
eg:小端
0x01 02 03 04
01是高位有效字节,04是低位,那么在内存中是这么存的:
0x04 0x03 0x02 0x01

字节序转化内函数

h  - host 主机,主机字节序 
to - 转换成什么 
n  - network 网络字节序 
s  - short unsigned short 
l  - long unsigned int#include <arpa/inet.h> 
// 转换端口 short型,2个字节
uint16_t htons(uint16_t hostshort); // 主机字节序 => 网络字节序 
uint16_t ntohs(uint16_t netshort); // 主机字节序 => 网络字节序 
// 转IP int型,4个字节
uint32_t htonl(uint32_t hostlong); // 主机字节序 => 网络字节序 
uint32_t ntohl(uint32_t netlong); // 主机字节序 => 网络字节序

ip地址转换------点分十进制<–>网络通信2进制

通常,人们习惯用可读性好的字符串来表示 IP 地址,比如用点分十进制字符串表示 IPv4 地址,以及用十六进制字符串表示 IPv6> 地址。但编程中我们需要先把它们转化为整数(二进制数)方能使用。而记录日志时则相反,我们要把整数表示的 IP 地址转化为可读的字符串

新版:同时适用于IPV4和IPV6* 字母含义* `p`:点分十进制的IP字符串* `n`:表示network,网络字节序的整数
* `int inet_pton(int af, const char *src, void *dst); `* 使用`man inet_pton`查看帮助* 功能:将点分十进制的IP地址字符串,转换成网络字节序的整数* 参数* `af`:地址族* IPV4:`AF_INET`* IPV6:`AF_INET6(IPV6)`* `src`:需要转换的点分十进制的IP字符串* `dst`:转换后的结果保存在这个里面* 返回值* 1:成功* 0:源IP地址有误* -1:地址族包含不可用的地址协议
* `const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);`* 使用`man inet_ntop`查看帮助* 功能:将网络字节序的整数,转换成点分十进制的IP地址字符串* 参数* `af`:地址族* IPV4:`AF_INET`* IPV6:`AF_INET6(IPV6)`* `src`:要转换的ip的整数的地址* `dst`:转换成IP地址字符串保存的地方* `size`:第三个参数的大小(数组的大小)* 返回值:返回转换后的数据的地址(字符串),和 dst 是一样的

把IP和port打包为一个socket地址

协议族地址族描述
PF_UNIXAF_UNIXUNIX本地域协议族
PF_INETAF_INETTCP/IPV4z协议族
PF_INET6AF_INET6tcp/IPV6协议族
//socket网络通信接口中表示socket地址的是一个结构体,他的地址作为通信用,但一般用下面的改进版本,再转换成这个
#include <bits/socket.h> 
struct sockaddr { sa_family_t sa_family; char sa_data[14]; 
};typedef unsigned short int sa_family_t;

为了兼容IPV6,新的socketaddr_in

// IPV4
#include <netinet/in.h> 
-----------------------------------------------------------------------
struct sockaddr_in { sa_family_t sin_family; /* __SOCKADDR_COMMON(sin_) */ in_port_t sin_port; /* Port number. */ struct in_addr sin_addr; /* Internet address. */ /* Pad to size of `struct sockaddr'. */ unsigned char sin_zero[sizeof (struct sockaddr) - __SOCKADDR_COMMON_SIZE - sizeof (in_port_t) - sizeof (struct in_addr)]; 
};
-----------------------------------------------------------------------
struct in_addr { in_addr_t s_addr; 
};// IPV6
struct sockaddr_in6 { sa_family_t sin6_family; in_port_t sin6_port; /* Transport layer port # */ uint32_t sin6_flowinfo; /* IPv6 flow information */ struct in6_addr sin6_addr; /* IPv6 address */ uint32_t sin6_scope_id; /* IPv6 scope-id */ 
};// 相关定义
typedef unsigned short uint16_t; 
typedef unsigned int uint32_t; 
typedef uint16_t in_port_t; 
typedef uint32_t in_addr_t; 
#define __SOCKADDR_COMMON_SIZE (sizeof (unsigned short int))

TCP通信框架

在这里插入图片描述

实例,客户端和服务端通信

服务端:
#include <stdio.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <iostream>
#include <string>using namespace std;
#define SERVERIP "192.168.226.129"
#define PORT 9999//服务器端
int main() {//创建socket套接字,形成监听fdint lfd = socket(AF_INET, SOCK_STREAM, 0);if (lfd == -1) {perror("socket");return -1;}//形成一个端,把ip和port打包好在新版的sockaddr_in结构体中struct sockaddr_in mServ;mServ.sin_family = AF_INET;mServ.sin_port = htons(PORT);//将上面字符串形式的点分十进制IP转化为网络字节序的IPinet_pton(AF_INET, SERVERIP, &mServ.sin_addr.s_addr);//将上面的打包的端和监听fd绑定int ret = bind(lfd, (struct sockaddr*)&mServ, sizeof(mServ));if (ret == -1) {perror("bind");return -1;}//监听fd开始监听,后面的值代表未连接和连接的数ret = listen(lfd, 128);if (ret == -1) {perror("listen");return -1;}cout << "服务器启动成功,等待连接...." << endl;//接受连接,返回一个新的真正用于交换数据的fdstruct sockaddr_in client;socklen_t client_addr_len = sizeof(client);int cfd = accept(lfd, (struct sockaddr*)&client, &client_addr_len);if (cfd == -1) {perror("accept");return -1;}//输出客户端的ip和端口char clinet_ip[16];inet_ntop(AF_INET, &client.sin_addr.s_addr, clinet_ip, sizeof(clinet_ip));//将n->p的ip写到clinet_ip中int clinet_port = ntohs(client.sin_port);cout << "连接成功!客户端IP:" << clinet_ip << " 端口:" << clinet_port << endl;//读取客户端的数据char buf[1024];char writer[1024];while(1) {int read_len = read(cfd, buf, sizeof(buf));if (read_len == -1) {perror("read");return -1;}else if (read_len == 0) {cout << "客户端断开连接!" << endl;break;}else if (read_len >0) cout << "客户端发来的数据:" << buf << endl;//向客户端发送数据cout << "请输入要发送的数据:";cin >> writer;write(cfd, writer, sizeof(writer));}   close(cfd);close(lfd);return 0;
}
客户端
#include <stdio.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <iostream>
#include <string>using namespace std;
#define SERVERIP "192.168.226.129"
#define PORT 9999//客户端
int main() {int fd = socket(AF_INET, SOCK_STREAM, 0);if (fd == -1) {perror("client_socket");return -1;}//打包client的IP和PORT信息struct sockaddr_in clit;clit.sin_family = AF_INET;clit.sin_port = htons(PORT);inet_pton(AF_INET, SERVERIP, &clit.sin_addr.s_addr);//客户端开始连接服务器int ret = connect(fd, (struct sockaddr*)&clit, sizeof(clit));if (ret == -1) {perror("client connect");return -1;}cout << "客户端开始连接...." << endl;//开始通信char writer[1024];char buf[1024];while(1) {cout << "请输入发给服务器的内容:";cin >> writer;ret = write(fd, writer, sizeof(writer));if (ret == -1) {perror("client write");return -1;}ret = read(fd, buf, sizeof(buf));if (ret == -1) {perror("client read");return -1;} else if (ret == 0) {cout << "服务器断开连接" << endl;break;} else  cout << "受到客户端返回信息:" << buf << endl;}close(fd);return 0;
}

相关文章:

计算机网络开发(2)TCP\UDP区别、TCP通信框架、服务端客户端通信实例

TCP与UDP区别 UDP&#xff1a;用户数据报协议&#xff0c;面向无连接&#xff0c;可以单播&#xff0c;多播&#xff0c;广播&#xff0c; 面向数据报&#xff0c;不可靠TCP&#xff1a;传输控制协议&#xff0c;面向连接的&#xff0c;可靠的&#xff0c;基于字节流&#xff…...

ubuntu打包 qt 程序,不用每次都用linuxdeployqt打包

用linuxdeployqt打包太麻烦&#xff0c;每次程序编译都要用linuxdeployqt打包一次&#xff0c;而且每次都要很长时间&#xff0c;通过研究得出一个新的打包方法 1.用用linuxdeployqt得出依赖的库文件&#xff08;只要没有增加新模块&#xff0c;只要用一次就可以&#xff09; …...

【Python项目】基于深度学习的车辆特征分析系统

【Python项目】基于深度学习的车辆特征分析系统 技术简介&#xff1a;采用Python技术、MySQL数据库、卷积神经网络&#xff08;CNN&#xff09;等实现。 系统简介&#xff1a;该系统基于深度学习技术&#xff0c;特别是卷积神经网络&#xff08;CNN&#xff09;&#xff0c;用…...

C++(初阶)(二)——类和对象

类和对象 类和对象类的定义格式访问限定符类域 实例化实例化概念内存对齐 this指针 类的定义 类&#xff08;Class&#xff09;是一种用于创建对象的蓝图或模板。它定义了对象&#xff08;变量&#xff09;的属性&#xff08;数据&#xff09;和方法&#xff08;行为&#xff…...

JS—组成:2分钟掌握什么是ECMAScript操作,什么是DOM操作,什么是BOM操作

个人博客&#xff1a;haichenyi.com。感谢关注 1. 目录 1–目录2–组成3–内置对象 2. 组成 一直都在说JS&#xff0c;JS&#xff0c;到底啥是JS有了解过吗&#xff1f;JS由哪几部分组成的呢&#xff1f; 定义&#xff1a; JavaScript是一种轻量级、解释型或即时编译型的编程语…...

ArcGIS操作:10 投影坐标系转地理坐标系

应用情景&#xff1a;在计算shp面质心坐标的时&#xff0c;由于需要的坐标是经纬度&#xff0c;所以需要将投影坐标系转化为地理坐标系 1、打开工具箱 2、右侧&#xff1a;数据管理工具 → 投影和变换 → 要素 → 投影 3、选择投影的数据、输出路径、地理坐标系&#xff0c;点…...

NVIDIA Jetson Nano的国产替代,基于算能BM1684X+FPGA+AI算力盒子,支持deepseek边缘部署

NVIDIA Jetson Nano的国产替代&#xff0c;基于算能BM1684X的AI算力盒子&#xff0c;支持deepseek边缘部署 另外&#xff0c;还提供BM1684XFPGAAI的解决方案。 核心板基于Sophon SG2300X SoC&#xff08;也叫BM1684X&#xff09;打造 带有8核ARM Cortex-A53 2.3GHz&#xff0c…...

c++全排列

题目描述 按照字典序输出自然数 1 到 n 所有不重复的排列&#xff0c;即 n 的全排列&#xff0c;要求所产生的任一数字序列中不允许出现重复的数字。 输入格式 一个整数 n。 输出格式 由 1∼n 组成的所有不重复的数字序列&#xff0c;每行一个序列。 每个数字保留 5 个场…...

VSCode 配置优化指南:打造极致高效的前端开发环境

VSCode 配置优化指南&#xff1a;打造极致高效的前端开发环境 一、基础环境配置&#xff1a;让开发更流畅 1. 性能优化设置 // settings.json {"files.autoSave": "afterDelay", // 自动保存&#xff08;延迟1秒&#xff09;"files.exclud…...

利用 ArcGIS Pro 快速统计省域各市道路长度的实操指南

在地理信息分析与处理的工作中&#xff0c;ArcGIS Pro 是一款功能强大的 GIS 软件&#xff0c;它能够帮助我们高效地完成各种复杂的空间数据分析任务。 现在&#xff0c;就让我们一起深入学习如何借助 ArcGIS Pro 来统计省下面各市的道路长度&#xff0c;这一技能在城市规划、…...

CTF 中的 XSS 攻击:原理、技巧与实战案例

跨站脚本攻击&#xff08;Cross-Site Scripting&#xff0c;简称 XSS&#xff09;是一种常见的 Web 漏洞&#xff0c;利用该漏洞&#xff0c;攻击者可以在受害者浏览器中注入并执行恶意脚本。在 CTF&#xff08;Capture The Flag&#xff09;竞赛中&#xff0c;XSS 攻击不仅是一…...

LeetCode hot 100—二叉树的最大深度

题目 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;3示例 2&#xff1a; 输入&#xff1a;root [1,n…...

.h264/.h265文件 前端直接播放

由于接收摄像头 告警视频&#xff0c;需要前端直接播放&#xff0c;不想后端转码后传输。 摄像头 判断到告警后往服务器上报 .h264 /.h265 视频文件。 解决方式&#xff1a;html5直接采用 ffmpeg 进行转码 &#xff0c;然后塞入 video标签&#xff0c;进行播放 目前改动ffmp…...

【单片机通信技术】串口通信的几种方式与比较,详细解释SPI通信

一、介绍 串口通信是一种通过串行接口逐位传输数据的通信方式&#xff0c;广泛应用于嵌入式系统、工业控制、传感器网络等领域。 二、以下是几种常见的串口通信方式及其对比&#xff1a; 1.UART&#xff08;Universal Asynchronous Receiver/Transmitter&#xff09; 特点&am…...

PDF转JPG(并去除多余的白边)

首先&#xff0c;手动下载一个软件&#xff08;poppler for Windows&#xff09;&#xff0c;下载地址&#xff1a;https://github.com/oschwartz10612/poppler-windows/releases/tag/v24.08.0-0 否则会出现以下错误&#xff1a; PDFInfoNotInstalledError: Unable to get pag…...

题目 3217 ⭐成绩统计⭐【滑动窗口 + 二分搜索】蓝桥杯2024年第十五届省赛

小蓝的班上有 n n n 个人&#xff0c;一次考试之后小蓝想统计同学们的成绩&#xff0c;第 i 名同学的成绩为 a i a_i ai​ 。当小蓝统计完前 x x x 名同学的成绩后&#xff0c;他可以从 1 ∼ x 1 ∼ x 1∼x 中选出任意 k k k 名同学的成绩&#xff0c;计算出这 k k k 个成…...

URL中的特殊字符与web安全

在现代Web应用中&#xff0c;URL作为客户端与服务器之间的通信桥梁&#xff0c;承载着大量的重要信息。URL中的特殊字符&#xff0c;看似只是一些常见的符号&#xff0c;但在Web安全领域&#xff0c;它们与其他安全知识密切相关&#xff0c;如在Base64编码、SQL注入&#xff0c…...

八卡5090服务器首发亮相!

AI 人工智能领域热度居高不下。OpenAI 的 GPT - 4 凭强悍语言处理能力&#xff0c;在内容创作、智能客服等领域广泛应用。清华大学团队的 DeepSeek 大模型在深度学习训练优势突出&#xff0c;正促使各行业应用端算力需求向推理主导转变&#xff0c;呈爆发式增长 。 随着 DeepS…...

esp32驱动带字库芯片TFT屏幕

前言 学习esp32单片机开发&#xff0c;前段时间在网上买了一块2.0寸TFT屏幕。 长这个样子&#xff0c;这个屏幕带汉字字库的硬件模块。我仔细看了一下这个字库模块上面写的字是25Q32FVSIG 1336 文档 卖家也发来了开发文档&#xff0c;是个doc文档&#xff0c;张这个样子。 开…...

为AI聊天工具添加一个知识系统 之138 设计重审 之2 文章学 引言之2 附加符号学附属诠释学附随工程学(联系)

本文要点 要点 符号学大局观&#xff1a; 诠释学&#xff08;当代 加成[0]&#xff1a;“预期”和“预设” 两者的 不期而遇 。“邂逅”&#xff09; 我们在文章学工具设计中 以全局观考虑&#xff1a;嵌入编程工具的逻辑性底&#xff08; 哲学诠释 下确界&#xff09; 并…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径

目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八

现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet&#xff0c;点击确认后如下提示 最终上报fail 解决方法 内核升级导致&#xff0c;需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

三体问题详解

从物理学角度&#xff0c;三体问题之所以不稳定&#xff0c;是因为三个天体在万有引力作用下相互作用&#xff0c;形成一个非线性耦合系统。我们可以从牛顿经典力学出发&#xff0c;列出具体的运动方程&#xff0c;并说明为何这个系统本质上是混沌的&#xff0c;无法得到一般解…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2

每日一言 今天的每一份坚持&#xff0c;都是在为未来积攒底气。 案例&#xff1a;OLED显示一个A 这边观察到一个点&#xff0c;怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 &#xff1a; 如果代码里信号切换太快&#xff08;比如 SDA 刚变&#xff0c;SCL 立刻变&#…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”

2025年#高考 将在近日拉开帷幕&#xff0c;#AI 监考一度冲上热搜。当AI深度融入高考&#xff0c;#时间同步 不再是辅助功能&#xff0c;而是决定AI监考系统成败的“生命线”。 AI亮相2025高考&#xff0c;40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕&#xff0c;江西、…...

Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?

在大数据处理领域&#xff0c;Hive 作为 Hadoop 生态中重要的数据仓库工具&#xff0c;其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式&#xff0c;很多开发者常常陷入选择困境。本文将从底…...

[论文阅读]TrustRAG: Enhancing Robustness and Trustworthiness in RAG

TrustRAG: Enhancing Robustness and Trustworthiness in RAG [2501.00879] TrustRAG: Enhancing Robustness and Trustworthiness in Retrieval-Augmented Generation 代码&#xff1a;HuichiZhou/TrustRAG: Code for "TrustRAG: Enhancing Robustness and Trustworthin…...

ubuntu22.04有线网络无法连接,图标也没了

今天突然无法有线网络无法连接任何设备&#xff0c;并且图标都没了 错误案例 往上一顿搜索&#xff0c;试了很多博客都不行&#xff0c;比如 Ubuntu22.04右上角网络图标消失 最后解决的办法 下载网卡驱动&#xff0c;重新安装 操作步骤 查看自己网卡的型号 lspci | gre…...

Spring AOP代理对象生成原理

代理对象生成的关键类是【AnnotationAwareAspectJAutoProxyCreator】&#xff0c;这个类继承了【BeanPostProcessor】是一个后置处理器 在bean对象生命周期中初始化时执行【org.springframework.beans.factory.config.BeanPostProcessor#postProcessAfterInitialization】方法时…...