网络编程(二)TCP编程 TCP粘包问题
文章目录
- 一、TCP网络编程
- (一)流程
- (二)相关函数
- 1. socket
- 2. bind
- 3. listen
- 4. accept
- 5. connect
- 二、收发函数
- (一)send函数
- (二)recv函数
- 三、TCP粘包问题
- (一)将两次消息间隔一定时间后再发送
- (二)关闭Nagle算法
- (三)定长发送数据
- 四、TCP下载程序
一、TCP网络编程
网络编程模型:
C/S模型:客户端服务器模型
优点:
客户端可以缓存一些数据,使用时直接在本地读取,无需每次重新下载;
由于客户端和服务器都是自己开发的,可以自定义协议
缺点:代码开发量大
B/S模型:浏览器服务器模型
优点:代码开发量较小
缺点:
客户端不能缓存数据,每次使用都需要重新从服务器端下载;
必须遵循http协议
(一)流程

服务器流程:
创建套接字–socket()
填充服务器的网络信息结构体
将套接字与服务器网络信息结构体绑定–bind()
将套接字设置成被动监听状态–listen()
阻塞等待客户端连接–accept()
收发数据–write()/read()
关闭套接字–close()
客户端流程:
创建套接字–socket()
填充服务器的网络信息结构体
(可以绑定,即指定端口号与服务器通信;可以不绑定,系统会分配一个临时端口号用于与服务器通信)
与服务器建立连接–connect()
收发数据–write()/read()
关闭套接字–close()
(二)相关函数
1. socket
#include <sys/types.h>
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
功能:创建套接字
参数:domain:通信域AF_UNIX AF_LOCAL 本地通信使用AF_INET IPV4使用AF_INET6 IPV6使用AF_PACKET 原始套接字使用type:套接字类型SOCK_STREAM TCP使用SOCK_DGRAM UDP使用protocol:附加协议 传0 表示没有附加协议
返回值:成功 套接字(文件描述符)失败 -1 重置错误码
2. bind
#include <sys/types.h>
#include <sys/socket.h>
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
功能:将套接字与服务器网络信息结构体绑定
参数:sockfd:套接字addr:网络信息结构体的首地址struct sockaddr {sa_family_t sa_family;char sa_data[14];}//上面的结构体只是用来强转 防止编译警告的 //实际使用的是下面的结构体struct sockaddr_in {sa_family_t sin_family; /* AF_INET */in_port_t sin_port; /* 网络字节序的端口号 */struct in_addr sin_addr; /* 网络地址 */};struct in_addr {uint32_t s_addr; /* 网络字节序无符号4字节整型的IP地址 */};addrlen:addr的长度
返回值:成功 0失败 -1 重置错误码
3. listen
#include <sys/types.h>
#include <sys/socket.h>
int listen(int sockfd, int backlog);
功能:将套接字设置成被动监听状态
参数:sockfd:套接字backlog:指定半连接队列的最大长度一般传 5 10 等都可以 不是 0 就行//因为我们实际开发时 一般都是并发服务器 基本能维持半连接队列中没有元素
返回值:成功 0失败 -1 重置错误码
4. accept
#include <sys/types.h>
#include <sys/socket.h>
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
功能:提取半连接队列中的第一个链接,会返回一个新的套接字专门用于和该客户端通信如果半连接队列中没有连接请求 accept函数会阻塞等待客户端连接
参数:sockfd:套接字 必须是已经绑定了本地地址 且置成被动监听状态的addr:用于保存客户端的网络信息结构体的缓冲区的首地址 不关心可以传NULLaddrlen:addr的大小,不关心也可以传NULL
返回值:成功 新的套接字用于收发数据失败 -1 重置错误码
5. connect
#include <sys/types.h>
#include <sys/socket.h>
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
功能:与服务器建立连接
参数:sockfd:套接字addr:要连接的服务器的网络信息结构体的首地址addrlen:addr的长度
返回值:成功 0失败 -1 重置错误码
二、收发函数
(一)send函数
#include <sys/types.h>
#include <sys/socket.h>
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
功能:向套接字上发送一条消息
参数:sockfd:套接字buf:要发送的数据的首地址len:想要发送的字节数flags:标志位 0 阻塞 MSG_DONTWAIT 非阻塞
返回值:成功 实际发送的字节数失败 -1 重置错误码如果对方关闭了套接字或者断开连接,第一次send没有任何现象但是第二次send会产生一个SIGPIPE等价关系:
write(sockfd, buff, sizeof(buff));
send(sockfd, buff, sizeof(buff), 0);
sendto(sockfd, buff, sizeof(buff), 0, NULL, 0);
(二)recv函数
#include <sys/types.h>
#include <sys/socket.h>
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
功能:在套接字上接收一条消息
参数:sockfd:套接字buf:用来存放接收到的数据的缓冲区的首地址len:想要接收的字节数flags:标志位 0 阻塞 MSG_DONTWAIT 非阻塞
返回值:成功 实际接收的字节数失败 -1 重置错误码TCP的套接字,如果对方断开连接或者关闭套接字,recv会返回0等价关系:
read(sockfd, buff, sizeof(buff));
recv(sockfd, buff, sizeof(buff), 0);
recvfrom(sockfd, buff, sizeof(buff), 0, NULL, NULL);
三、TCP粘包问题
TCP协议中有一个Nagle 算法,他会通过减少数据包发送量来增进TCP/IP网上的性能。如果当前有一个部分填写的报文段(即还有可用空间可添加数据)在等待发送,那么就等到这个报文段填满或者达到最大延迟时间后再发送。
因为数据是没有边界的,因此可能会导致接收方在接收到数据后无法正常解析数据。
(一)将两次消息间隔一定时间后再发送
服务器程序中禁止使用sleep函数
(二)关闭Nagle算法
int value = 1;
setsockopt(sock_fd,IPPROTO_TCP,TCP_NODELAY,(char*)&value,sizeof(int));
(三)定长发送数据
还可以在包的开头标注有效数据长度。
四、TCP下载程序
server.c
client.c
相关文章:
网络编程(二)TCP编程 TCP粘包问题
文章目录 一、TCP网络编程(一)流程(二)相关函数1. socket2. bind3. listen4. accept5. connect 二、收发函数(一)send函数(二)recv函数 三、TCP粘包问题(一)将…...
【总线】AXI总线:FPGA设计中的通信骨干
目录 AXI4:高性能地址映射通信的基石 AXI4-Lite:轻量级但功能强大的通信接口 AXI4-Stream:高速流数据传输的利器 结语:AXI总线在FPGA设计中的重要性 大家好,欢迎来到今天的总线学习时间!如果你对电子设计、特别是FPGA和SoC设计…...
Cesium源码解析六(3dtiles属性获取、建筑物距离计算、建筑物着色及其原理分析)
快速导航 Cesium源码解析一(搭建开发环境) Cesium源码解析二(terrain文件的加载、解析与渲染全过程梳理) Cesium源码解析三(metadataAvailability的含义) Cesium源码解析四(metadata元数据拓展…...
AI 情感聊天机器人之旅 —— 相关论文调研
开放域闲聊场景 Prompted LLMs as Chatbot Modules for Long Open-domain Conversation 发布日期:2023-05-01 简要介绍:作者提出了 MPC(模块化提示聊天机器人),这是一种无需微调即可创建高质量对话代理的新方法&…...
WPF Prism框架搭建
WPF Prism框架搭建 1.引入Prism框架 在Nuget包管理器中搜索Prism,并添加到项目中 2.在项目中使用prism框架 2.1 修改app.xaml 删除项目中自带的StartupUri 修改Application节点为prism:PrismApplication 引入prism命名空间 <prism:PrismApplication x:C…...
MyBatisplus使用报错--Invalid bound statement
报错如下 org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.lotus.mybatis.mapper.UserMapper.selectListat org.apache.ibatis.binding.MapperMethod$SqlCommand.<init>(MapperMethod.java:235)at com.baomidou.mybatisplus.cor…...
QT-QPainter实现一个动态充电的电池
1、效果 2、核心代码 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTimer>...
【云原生】Kubernetes----Metrics-Server组件与HPA资源
目录 引言 一、概述 (一)Metrics-Server简介 (二)Metrics-Server的工作原理 (三)HPA与Metrics-Server的作用 (四)HPA与Metrics-Server的关系 (五)HPA与…...
模拟原神圣遗物系统-小森设计项目,设计圣遗物(生之花,死之羽,时之沙,空之杯,理之冠)抽象类
分析圣遗物 在圣遗物系统,玩家操控的是圣遗物的部分 因此我们应该 物以类聚 人与群分把每个圣遗物的部分,抽象出来 拿 生之花,死之羽为例 若是抽象 类很好的扩展 添加冒险家的生之花 时候继承生之花 并且名称冒险者- 生之花 当然圣遗物包含…...
仿真模拟--telnet服务两种认证模式(自作)
自己做的笔记,有问题或看不懂请见解一下~ 目录 两个路由器间实现telnet服务(password认证模式) server client 两个路由器间实现telnet服务(aaa认证模式) server client 改名 tab键补齐 不会就扣问号 ? save 两个路由器间实现telnet服务…...
Apple Phone Memory
Apple Phone Memory 苹果手机内存查询,哪些应用程序(app)占用内存: 设置 通用 iPhone储存空间 清理下QQ音乐:...
Kubernetes容器运行时:Containerd vs Docke
容器化技术笔记 Kubernetes容器运行时:Containerd vs Docke - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite:http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this arti…...
【java 线程的状态】
介绍 Java 线程在运⾏的⽣命周期中的指定时刻只可能处于下⾯ 6 种不同状态的其中⼀个状态 状态名称说明NEW初始状态,线程被构建,但是还没有调用start()方法RUNNABLE运行状态,Java线程将操作系统中的就绪和运行两种状态统称为"运行中"BLOCKED阻塞状态,表示线程阻塞于…...
php加密验签
签名生成步骤(小程序端/前端): 确定参与签名的参数:选择需要参与签名的请求参数,通常包括请求的时间戳、随机数、请求的数据等。 参数排序与拼接:将所有参与签名的参数按照字母顺序排序,并拼接成…...
【Golang - 90天从新手到大师】Day06 - 数组
系列文章合集 Golang - 90天从新手到大师 数组是golang中最常用的一种数据结构,数组就是同一类型数据的有序集合 定义一个数组 格式: var name [n]type n为数组长度,n>0 且无法修改,type为数组的元素类型如: var a [2]int上面的例子定义了一个长度为2,元素类型为int的数组…...
java的有参构造方法
java的有参构造方法和无参构造方法类似,区别是构造方法名称里后面跟着一个括号,括号里是参数的定义 示例代码如下 class student4{private String name;private int age;public student4(String n,int a) {namen;agea;System.out.println("调用了…...
Vue66-vue-默认插槽
一、默认插槽需求 1-1、原本的写法: 在每个category组件中用v-show来做条件渲染,但是不方便! 1-2、默认插槽 img标签,ul标签,video标签,都是在app组件中完成解析之后,塞到category组件中的&…...
tsf-consul的使用
在腾讯云微服务平台TSF中使用Consul作为服务发现组件,通常需要遵循以下步骤: ### 1. 创建应用 首先,您需要在TSF控制台创建一个应用。在创建应用时,选择合适的业务类型、开发语言、开发框架等信息。对于使用Consul作为服务发现组件的Spring Cloud应用,您需要选择“业务应…...
【perl】基本语法 /备忘录/
分享 perl 语言学习资源 Perl 教程|极客教程 (geek-docs.com) Perl [zh] (runebook.dev) Perl 运算符 | 菜鸟教程 (runoob.com) Perl Documentation - Perldoc Browser Search the CPAN - metacpan.org 当然还有一些经典书籍,不再列举。 1、数字 1.1、数字表…...
mongodb 集群安装
整体架构图: 1. 配置域名 Server1: OS version: CentOS Linux release 8.5.2111 hostnamectl --static set-hostname mongo01 vi /etc/sysconfig/network # Created by anaconda hostnamemong01 echo "192.168.88.20 mong1 mongo01.com mongo…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...
centos 7 部署awstats 网站访问检测
一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats࿰…...
在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)
考察一般的三次多项式,以r为参数: p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]; 此多项式的根为: 尽管看起来这个多项式是特殊的,其实一般的三次多项式都是可以通过线性变换化为这个形式…...
逻辑回归暴力训练预测金融欺诈
简述 「使用逻辑回归暴力预测金融欺诈,并不断增加特征维度持续测试」的做法,体现了一种逐步建模与迭代验证的实验思路,在金融欺诈检测中非常有价值,本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...
深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏
一、引言 在深度学习中,我们训练出的神经网络往往非常庞大(比如像 ResNet、YOLOv8、Vision Transformer),虽然精度很高,但“太重”了,运行起来很慢,占用内存大,不适合部署到手机、摄…...
ubuntu22.04有线网络无法连接,图标也没了
今天突然无法有线网络无法连接任何设备,并且图标都没了 错误案例 往上一顿搜索,试了很多博客都不行,比如 Ubuntu22.04右上角网络图标消失 最后解决的办法 下载网卡驱动,重新安装 操作步骤 查看自己网卡的型号 lspci | gre…...
k8s从入门到放弃之HPA控制器
k8s从入门到放弃之HPA控制器 Kubernetes中的Horizontal Pod Autoscaler (HPA)控制器是一种用于自动扩展部署、副本集或复制控制器中Pod数量的机制。它可以根据观察到的CPU利用率(或其他自定义指标)来调整这些对象的规模,从而帮助应用程序在负…...
Python训练营-Day26-函数专题1:函数定义与参数
题目1:计算圆的面积 任务: 编写一个名为 calculate_circle_area 的函数,该函数接收圆的半径 radius 作为参数,并返回圆的面积。圆的面积 π * radius (可以使用 math.pi 作为 π 的值)要求:函数接收一个位置参数 radi…...
AxureRP-Pro-Beta-Setup_114413.exe (6.0.0.2887)
Name:3ddown Serial:FiCGEezgdGoYILo8U/2MFyCWj0jZoJc/sziRRj2/ENvtEq7w1RH97k5MWctqVHA 注册用户名:Axure 序列号:8t3Yk/zu4cX601/seX6wBZgYRVj/lkC2PICCdO4sFKCCLx8mcCnccoylVb40lP...
