TCP套接字

1.概念

套接字是专门进行网络间数据通信的一种文件类型,可以实现不同主机之间双向通信,包含了需要交换的数据和通信双方的IP地址和port端口号。

2.套接字文件的创建

int socket(int domain, int type, int protocol);
功能:该函数用来创建各种各样不同的套接字
参数参数 domain:套接字所依赖的网络介质AF_INET:表明是 ipv4AF_INET6:表明是 ipv6AF_LOCAL/AF_UNIX:表明是本地通信,不是网络通信,专门指代域套接字参数 type:套接字的类型,常用的类型就一下2种SOCK_STREAM:提供一个有序的,可靠的,双向的(全双工),基于连接的 字节流套接字一个超大的数据传输都是有可能支持SOCK_DGRAM:提供一个数据包(非连接的,不可靠的,有最大长度要求的)套接字字节流优点:允许发送无穷大的数据,只不过在内核中给这些数据做了分割而是,但是实际上由于连续发送的原因,这些数据最终还是粘连在一起字节流缺点:对于接受端来说,接受到的多组数据都粘连在一起了,所以需要额外花功夫去区分从哪到哪是一组数据数据报优点:数据不会粘连,发几次数据就是几次数据数据报缺点:发送的数据由于不会粘连,需要手动的将超大数据分批次发送,每次发送的数据大小有上限参数 protocol : 套接字依赖的通信协议一般直接写 0 ,表示根据 参数type 和 参数 domain,自动选择通信协议一般情况下:AF_INET + SOCK_STREAM + 0 ,最终创建是一个 TCP 套接字AF_INET + SOCK_DGRAM + 0 ,最终创建的是一个 UDP 套接字


3.TCP和UDP区别

tcp是可靠的,基于连接的字节流协议

tcp 拥有流量控制功能,顺序控制功能,应答重发功能,以保证在网络不拥堵的时候,所有数据都能正确发送

udp协议由于非连接,没有可靠的应答手段

所以 udp协议传输效率高于tcp协议,传输的稳定性低于tcp协议

udp协议容易丢包,但是速度快

4.向套接字中写入ip和port

4.1目的

客户端:

写入 ip 的目的:通过ip地址,找到该客户端想要连接的服务器在哪

写入 port的目的:通过port明确,想要发送的数据,应该发送到服务器的哪个进程里面、哪个端口里面

服务器:

写入 ip 的目的:过滤掉一些不想接受连接的客户端,指定仅仅只接受哪些客户端的连接

如果写入:

192.168.1.1 : 表示,只接受ip地址为 192.168.1.1 客户端的连接

192.168.1.0 :表示,只接受这个网段下,所有客户端的连接,这个网段下有几个客户端取决于子网掩码

0.0.0.0 :表示,不做任何过滤,允许所有客户端的连接,服务器套接字ip地址一般都写这个

写入port的目的:由于客户端发送数据时候,只会向特定port中发送数据,所以服务器在读取客户端所发送数据的时候,一定要去客户端所填写的port中读取数据

4.2为套接字写入ip和port的函数

int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
功能:为套接字 sockfd 写入 ip 和 port
参数 sockfd:准备写入ip和port的套接字
参数 addr:类型为 sockaddr * ,是一个通用套接字结构体地址这里根据套接字种类的不同(ipv4,还是ipv6,还是本地域套接字),真实传入的套接字结构体地址是不同的但是无论怎么不同,功能都是一样这个参数的最终目的,都是用来描述套接字中的一些信息的比如说:tcp用的ipv4套接字,结构体里面就应该记录了一个 ipv4的地址和一个port端口号tcp用的ipv6套接字,这里就应该传入一个结构体,里面记录了一个 ipv6地址和一个port端口号本地域套接字,这里就应该传入一个结构体,里面记录了一个本地套接字文件的路径名我们如果使用的是 tcp套接字的话,这里要求提前准备一个struct sockaddr_in 类型的结构体
参数 addrlen:实际上就是参数 addr 的长度

5.通过套接字发送数据

专门针对套接字的发送函数

ssize_t send(int sockfd, const void *buf, size_t len, int flags);
功能:通过套接字sockfd,将数据发送到接收端
参数 sockfd、buf、len : 这3个参数和 write 一模一样,意义也一样
参数 flags : 唯一和write 不一样的参数,这个参数一般只有2个选项0 :默认属性,默认属性下,send和write 一会儿事MSG_DONTWAIT : 填写这个宏的话,会让send函数称为一个非阻塞型函数send 和 write 默认是阻塞函数send 和 write 什么时候会产生阻塞?当写入数据的目标地点,接收区满了之后,再次写入数据,就会产生阻塞,等待接收区产生空余空间位置如果 send 和 write 变成 非阻塞函数之后接收区写满,再次send 或者 write 新写入的数据将被丢弃,写入失败
返回值:成功返回写入的数据的字节数,失败返回 -1所以:send对比write的优点就是:send可以很轻松的在阻塞和非阻塞之间切换write虽然也可以在阻塞和非阻塞之间切换,但是操作比较复杂

6.通过套接字接收数据

ssize_t recv(int sockfd, void *buf, size_t len, int flags);
功能:通过套接字 sockfd接受网络中发来的数据
参数 sockfd、buf、len 和read一样
参数 flags :有2个选项0:默认属性,默认状态下,recv和read一模一样MSG_DONTWAIT:使read函数称为一个非阻塞函数返回值:阻塞模式下:成功接受数据,返回接受到的数据的字节数,套接子损坏,返回-1当阻塞模式 变成非阻塞模式后,recv就会一直返回0当客户端与服务器连接中的时候,recv函数默认是一个阻塞函数当客户端与服务器断开链接后,recv函数就会从阻塞模式瞬间变成非阻塞模式所以,我们可以通过recv函数的返回值,判断,客户端\服务器是否下线非阻塞模式下:成功接受数据,返回接受到的数据的字节数如果没有数据可接受,返回0如何客户端与服务器断开链接,返回-1总结:recv对比read优点recv可以轻松的切换成非阻塞模式read稍微要花点功夫

7.tcp服务器创建流程

1.创建服务器套接字

int server = socket(AF_INET,SOCK_STREAM,0);

2.准备struct sockaddr_in 结构体

将ip 和 port提前放在结构体中

struct sockaddr_in addr = {0};addr.sin_family = AF_INET;	addr.sin_port = htons(port);addr.sin_addr.s_addr = inet_addr("0.0.0.0");

3.用bind函数讲准备好的结构体中的信息写入套接字

bind(server,(struct sockaddr*)&addr,sizeof(addr));

4.接收客户端的连接

accept(server,(struct sockaddr*)&client_addr,&client_len);

5.用read/recv读取客户端发来的消息

6.用write/snd发送消息

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

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

相关文章

Go语言高并发聊天室(一):架构设计与核心概念

Go语言高并发聊天室(一):架构设计与核心概念 🚀 引言 在当今互联网时代,实时通信已成为各类应用的核心功能。从微信、QQ到各种在线协作工具,高并发聊天系统的需求无处不在。本系列文章将手把手教你使用Go语…

Java基础:泛型

什么是泛型? 简单来说,Java泛型是JDK 5引入的一种特性,它允许你在定义类、接口和方法时使用类型参数(Type Parameters)。这些类型参数可以在编译时被具体的类型(如 String, Integer, MyCustomClass 等&…

RMSNorm实现

当前Qwen、Llama等系列RMSNorm实现源码均一致。具体现实如下: class RMSNorm(nn.Module):def __init__(self, hidden_size, eps1e-6):super().__init__()self.weight nn.Parameter(torch.ones(hidden_size))self.variance_epsilon epsdef forward(self, hidden_s…

智能Agent场景实战指南 Day 11:财务分析Agent系统开发

【智能Agent场景实战指南 Day 11】财务分析Agent系统开发 文章标签 AI Agent,财务分析,LLM应用,智能财务,Python开发 文章简述 本文是"智能Agent场景实战指南"系列第11篇,聚焦财务分析Agent系统的开发。文章深入解析如何构建一个能够自动处理财务报表…

人工智能安全基础复习用:可解释性

一、可解释性的核心作用1. 错误检测与模型改进发现模型的异常行为(如过拟合、偏见),优化性能。例:医疗模型中,可解释性帮助识别误诊原因。2. 安全与可信性关键领域(医疗、军事)需透明决策&#…

Qt:QCustomPlot类介绍

QCustomPlot的核心类就是QCustomPlot类。这个类继承自QWidget,因此可以像其他QWidget一样使用,比如放入布局中。QCustomPlot类基本结构一个QCustomPlot对象可以包含多个图层(通过QCPLayer表示),通常使用默认图层。它包…

Visual Studio 2022 上使用ffmpeg

目录 1. 添加包含目录 2. 添加库目录 3. 添加依赖项 4. 添加动态库目录 5. 测试 在解决方案中右击项目名称,弹出的窗口中选择 "属性"。 1. 添加包含目录 "C/C" -> "常规" -> "附加包含目录"中添加 ffmpeg中的…

Elasticsearch 线程池

Elasticsearch 线程池「每个线程池到底采用哪种实现策略」:Elasticsearch 线程池(ThreadPool)中 **所有内置线程池名称的常量定义**。 每个字符串常量对应一个 **线程池的名字(name)**,也就是你在 Thread…

深入理解 Next.js API 路由:构建全栈应用的终极指南

Next.js 是一个强大的 React 框架,不仅支持服务端渲染(SSR)和静态站点生成(SSG),还提供了内置的 API 路由功能,使开发者能够轻松构建全栈应用。传统的全栈开发通常需要单独搭建后端服务&#xf…

【6.1.2 漫画分布式事务技术选型】

漫画分布式事务技术选型 🎯 学习目标:掌握架构师核心技能——分布式事务技术选型与一致性解决方案,构建高可靠的分布式系统 🎭 第一章:分布式事务模式对比 🤔 2PC vs 3PC vs TCC vs Saga 想象分布式事务就…

液冷智算数据中心崛起,AI算力联动PC Farm与云智算开拓新蓝海(二)

从算法革新到基础设施升级,从行业渗透到地域布局,人工智能算力正以 “规模扩张 效率提升”双轮驱动中国数字经济转型。中国智能算力规模将在 2025 年突破 1000 EFLOPS,2028 年达到 2781.9 EFLOPS,五年复合增长率 46.2%&#xff0…

《QtPy:Python与Qt的完美桥梁》

QtPy 是什么 在 Python 的广袤编程宇宙中,当涉及到图形用户界面(GUI)开发,Qt 框架宛如一颗璀璨的明星,散发着独特的魅力。而 QtPy,作为 Python 与 Qt 生态系统交互中的关键角色,更是为开发者们开…

ubuntu环境下调试 RT-Thread

调试 RT-Thread 下载源码 github 搜索 RT-Thread 下载源码 安装 python scons 环境 你已经安装了 kconfiglib,但 scons --menuconfig 仍然提示找不到它。这种情况通常是由于 Python 环境不一致 导致的:你在一个 Python 环境中安装了 kconfiglib&#xff…

【数据结构初阶】--顺序表(二)

🔥个人主页:草莓熊Lotso 🎬作者简介:C研发方向学习者 📖个人专栏: 《C语言》 《数据结构与算法》《C语言刷题集》《Leetcode刷题指南》 ⭐️人生格言:生活是默默的坚持,毅力是永久的…

Java中的方法传参机制

1. 概述Java中的方法传参机制分为两种:值传递(Pass by Value) 和 引用传递(Pass by Reference)。然而,Java中所有的参数传递都是值传递,只不过对于对象来说,传递的是对象的引用地址的…

C++——this关键字和new关键字

一、this 关键字1. 什么是 this?this 是 C 中的一个隐式指针,它指向当前对象(即调用成员函数的对象),在成员函数内部使用,用于引用调用该函数的对象。每个类的非静态成员函数内部都可以使用 this。使用 thi…

Python中类静态方法:@classmethod/@staticmethod详解和实战示例

在 Python 中,类方法 (classmethod) 和静态方法 (staticmethod) 是类作用域下的两种特殊方法。它们使用装饰器定义,并且与实例方法 (def func(self)) 的行为有所不同。1. 三种方法的对比概览方法类型是否访问实例 (self)是否访问类 (cls)典型用途实例方法…

FastGPT革命:下一代语言模型的极速进化

本文深度解析FastGPT核心技术架构,涵盖分布式推理、量化压缩、硬件加速等前沿方案,包含完整落地实践指南,助你掌握大模型高效部署的终极武器。引言:当大模型遭遇速度瓶颈2023年,ChatGPT引爆全球AI热潮,但企…

Geant4 安装---Ubuntu

安装工具 C/C工具包 sudo apt install build-essentialCmake sudo apt install -y cmakeccmake sudo apt install -y cmake-curses-gui安装Qt可视化工具(不需要可视化可以不安装) sudo apt-get install qtbase5-dev qtchooser qt5-qmake qtbase5-dev-tools qtcreator 安装Ope…

Spring Boot中请求参数读取方式

目录 一、前言 二、六种参数读取方式 1.RequestParam 2.PathVariable 3.RequestBody 4.RequestHeader 5.CookieValue 6.MatrixVariable 三、对比和搭配 1.适用方法类型及建议使用场景 2.建议使用的请求路径注解 3. 多种参数同时使用 4.同一请求不同方案&#xff1f…