网络编程(二)TCP编程 TCP粘包问题

news2024/11/27 16:51:01

文章目录

  • 一、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:用于保存客户端的网络信息结构体的缓冲区的首地址 不关心可以传NULL
    addrlen: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


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

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

相关文章

每天写java到期末考试(6.20)--集合2--练习--6.20

练习1 package QM_Fx;import java.util.ArrayList;public class test{public static void main(String[] args) {//1.创建一个集合ArrayList<String> listnew ArrayList<>();//2.添加元素list.add("点赞了吗");list.add("投币了吗");list.add(…

代码随想录-Day36

452. 用最少数量的箭引爆气球 有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组 points &#xff0c;其中points[i] [xstart, xend] 表示水平直径在 xstart 和 xend之间的气球。你不知道气球的确切 y 坐标。 一支弓箭可以沿着 x 轴从不同点 完全垂…

问题解决:Spring Boot 项目表单忽略前端提交的参数

在Spring项目中&#xff0c;如果你希望忽略前端提交的不在实体类&#xff08;通常是DTO或Model对象&#xff09;中的参数&#xff0c;有几种方法可以实现这一点。以下是几种常见的策略&#xff1a; 使用DTO&#xff08;Data Transfer Object&#xff09;: 创建一个DTO类&#x…

Day14——Python文本挖掘数据分析

文章目录 竞争分析-品类分布-适用对象竞争分析-产品结构-拜耳在这里插入图片描述竞争分析-产品结构-拜耳-BCG图竞争分析-产品结构-拜耳-明星竞争分析-产品结构-拜耳-奶牛竞争分析-产品结构-拜耳-问题竞争分析-产品结构-安速-BCG图竞争分析-产品结构-安速-明星竞争分析-产品结构…

【漏洞复现】万户-ezEIP success.aspx 反序列化漏洞

免责声明&#xff1a; 本文内容旨在提供有关特定漏洞或安全漏洞的信息&#xff0c;以帮助用户更好地了解可能存在的风险。公布此类信息的目的在于促进网络安全意识和技术进步&#xff0c;并非出于任何恶意目的。阅读者应该明白&#xff0c;在利用本文提到的漏洞信息或进行相关测…

MySQL----彻底卸载(附带每一步截图)

停止mysql服务 打开任务管理器&#xff0c;点击服务&#xff0c;找到mysql服务&#xff0c;这里我的是MySQL57&#xff0c;找到mysql服务后选中&#xff0c;点击右键选择停止服务 删除mysql服务 winR打开命令框&#xff0c;输入cmd打开cmd控制台或者电脑左下角输入cmd搜索&…

用户态协议栈03-icmp实现

icmp协议 ICMP&#xff08;Internet Control Message Protocol&#xff09;Internet控制报文协议。它是TCP/IP协议簇的一个子协议&#xff0c;用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并…

Linux字节对齐小程序

#include <stdio.h> // 默认对齐 struct DefaultAligned { char c; int i; }; // 按1字节对齐 #pragma pack(push, 1) struct OneByteAligned { char c; int i; }; #pragma pack(pop) // 恢复之前的对齐设置 int mai…

1964springboot VUE小程序在线学习管理系统开发mysql数据库uniapp开发java编程计算机网页源码maven项目

一、源码特点 springboot VUE uniapp 小程序 在线学习管理系统是一套完善的完整信息管理类型系统&#xff0c;结合springboot框架uniapp和VUE完成本系统&#xff0c;对理解vue java编程开发语言有帮助系统采用springboot框架&#xff08;MVC模式开发&#xff09;&#xff0c;…

Shiro721 反序列化漏洞(CVE-2019-12422)

目录 Shiro550和Shiro721的区别 判断是否存在漏洞 漏洞环境搭建 漏洞利用 利用Shiro检测工具 利用Shiro综综合利用工具 这一篇还是参考别的师傅的好文章学习Shiro的反序列化漏洞 上一篇也是Shiro的反序列化漏洞&#xff0c;不同的是一个是550一个是721&#xff0c;那么这…

《Windows API每日一练》5.2 按键消息

上一节中我们得知&#xff0c;Windows系统的按键消息有很多类型&#xff0c;大部分按键消息都是由Windows系统的默认窗口过程处理的&#xff0c;我们自己只需要处理少数几个按键消息。这一节我们将详细讲述Windows系统的所有按键消息及其处理方式。 本节必须掌握的知识点&…

厚膜电阻电路丝网印刷

厚膜丝网印刷 该技术用于需要长寿命、热耐久性、机械强度、导热性、高密度电气互连、低介电损耗等的苛刻应用 特征&#xff1a; 陶瓷标准工艺从前到后的通孔连接 正面和背面的丝网印刷电阻器是标准工艺 金导体可以用金线和/或氧化铝线进行线键合 可焊接金属化&#xff0c;…

《梦醒蝶飞:释放Excel函数与公式的力量》3.5常用数学函数max

3.5 MAX函数 教案主题&#xff1a;Excel中MAX函数的应用 一、定理定义 MAX函数是Excel中的一个内置函数&#xff0c;用于返回一组数值中的最大值。它可以应用于数据集&#xff0c;帮助用户快速识别最大数值&#xff0c;从而进行数据分析和决策。 二、语法结构 MAX函数的基…

国外开源字典集(wordlists)

Assetnote Wordlists Wordlists that are up to date and effective against the most popular technologies on the internet.https://wordlists.assetnote.io/

LInux驱动开发笔记(十)SPI子系统及其驱动

文章目录 前言一、SPI驱动框架二、总线驱动2.1 SPI总线的运行机制2.2 重要数据结构2.2.1 spi_controller2.2.2 spi_driver2.2.3 spi_device2.2.4 spi_transfer2.2.5 spi_message 三、设备驱动的编写3.1 设备树的修改3.2 相关API函数3.2.1 spi_setup( )3.2.2 spi_message_init( …

Docker定位具体占用大量存储的容器

监控告警生产环境的服务器磁盘分区使用率大于90%&#xff0c;进入服务器查看Docker 的 overlay2 存储驱动目录中占用很大&#xff0c;很可能是某个容器一直在打印日志&#xff0c;所以需要定位到是哪个容器&#xff0c;然后进行进一步排查。 然后进入到overlay2中查看是哪个目录…

Python日志管理利器:如何高效管理平台日志

一、为什么需要日志管理&#xff1f; 日志是应用程序的重要组成部分&#xff0c;它记录了应用程序的运行状态、错误信息以及用户交互等关键信息。良好的日志管理可以帮助开发人员及时发现和解决问题&#xff0c;提高应用程序的稳定性和可靠性。 项目在本地开发调试时&#xf…

第一百一十六节 Java 面向对象设计 - Java 终止块

Java 面向对象设计 - Java 终止块 ​try ​块也可以有零个或一个​ finally​ 块。 ​finally ​块总是与 ​try ​块一起使用。 语法 使用 ​finally​ 块的语法是 finally {// Code for finally block }​finally​ 块以关键字 ​finally​ 开始&#xff0c;后面紧跟一对…

qemu 安装ubuntu -纯命令行-可ssh-带网络-可gdb linux kernel

1&#xff0c;预备系统盘数据 1.1 下载光盘 注意需要 liver-server $ wget https://releases.ubuntu.com/22.04.4/ubuntu-22.04.4-live-server-amd64.iso 1.2 挂载并拷贝 $ sudo mkdir /mnt/iso_ubuntu-22.04.4-live-server-amd64 $ sudo mount ubuntu-22.04.4-live-ser…

Linux系统安装Dify结合内网穿透实现远程访问本地LLM开发平台

文章目录 前言1. Docker部署Dify2. 本地访问Dify3. Ubuntu安装Cpolar4. 配置公网地址5. 远程访问6. 固定Cpolar公网地址7. 固定地址访问 前言 本文主要介绍如何在Linux Ubuntu系统使用Docker快速部署大语言模型应用开发平台Dify,并结合cpolar内网穿透工具实现公网环境远程访问…