当全连接队列满了,tcp客户端收到服务端RST信令的模拟

当tcp服务端全连接队列满了后,并且服务端也不accept取出连接,客户端再次连接时,服务端能够看到SYN_RECV状态。但是客户端看到的是ESTABLISHED状态,所以客户端自认为成功建立了连接,故其写往服务端写数据,发现数据也确实写成功了。
但是后面等到服务端通过ACK+SYN告知客户端重新ACK时,发现此时客户端的业务数据已经到来了,故而认为出了问题,故重置连接。

对应的代码如下:

客户端:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>#define PORT 8888                                     //端口地址:8888
#define SERVER_IP "10.0.0.64"extern void process_conn_client(int s);int main(int argc,char *argv[])
{int s = 0;                                        //socket描述符struct sockaddr_in server_addr;                   //服务器地址结构int ret = 0;                                      //返回值char buf[1024] = {0};int i = 0;strcpy(buf, "hello world");/***  Step 2 : 建立套接字*/s = socket(AF_INET,SOCK_STREAM,0);                //创建一个AF_INET族的流类型socketif(s < 0)                                         //检查是否正常创建socket{perror("socket error\n");exit(EXIT_FAILURE);}/***  Step 3 : 设置服务器地址*/memset(&server_addr, 0, sizeof(server_addr));          //清零server_addr.sin_family = AF_INET;                 //设置地址族为AF_INETinet_pton(AF_INET, SERVER_IP, &(server_addr.sin_addr));server_addr.sin_port = htons(PORT);               //设置端口号/***  Step 4 : 将用户输入的字符串类型的IP地址转为整型*///inet_pton(AF_INET,argv[1],&server_addr.sin_addr);/***  Step 5 : 连接服务器*/ret = connect(s,(struct sockaddr*)&server_addr,sizeof(struct sockaddr));if(ret < 0){perror("connect error\n");printf("errno is %d\n", errno);exit(EXIT_FAILURE);}printf("connect succeed\n");//for(;;){//sleep(10000000);sprintf(buf, "hello world, %d", i);i++;ret = write(s,buf,strlen(buf)+1);if(ret < 0){printf("write failed, errno is %d\n", errno);}ret = read(s, buf, strlen(buf)+1);if(ret < 0){printf("read failed, errno is %d\n", errno);}}while(1)sleep(10);close(s);                                         //关闭连接
}

服务端:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <netinet/in.h>#define PORT 8888                                    //侦听端口地址:8888
#define BACKLOG 20                                    //侦听队列长度:2extern void process_conn_server(int s);              //服务器对客户端的处理:读取数据并发送响应字符int main(int argc,char *argv[])
{int ss = 0;                                      //ss = server socket = 服务器socket描述符int cs = 0;                                      //cs = client socket = 客户端socket描述符struct sockaddr_in server_addr;                  //服务器地址结构struct sockaddr_in client_addr;                  //客户端地址结构int ret = 0;                                     //返回值pid_t pid;//进程IDchar buffer[1024];ssize_t size = 0;/***  Step 2 : 建立套接字*/ss = socket(AF_INET,SOCK_STREAM,0);              //创建一个AF_INET族的流类型socketif(ss < 0)                                       //检查是否正常创建socket{perror("socket error\n");exit(EXIT_FAILURE);}/***  Step 3 : 设置服务器地址*  Note:*      htonl():将主机数转换成无符号长整型的网络字节顺序*      htons():将整型变量从主机字节顺序转变成网络字节顺序*/bzero(&server_addr,sizeof(server_addr));          //清零server_addr.sin_family = AF_INET;                 //设置地址族为AF_INETserver_addr.sin_addr.s_addr = htonl(INADDR_ANY);  //本地地址server_addr.sin_port = htons(PORT);               //设置端口号/***  Step 4 : 绑定地址结构到套接字描述符*/ret = bind(ss,(struct sockaddr*)&server_addr,sizeof(server_addr));if (ret < 0)                                      //出错{perror("bind error\n");exit(EXIT_FAILURE);}/***  Step 5 : 设置侦听,侦听队列长度为2,可同时处理两个客户端连接请求*/ret = listen(ss,BACKLOG);if (ret < 0)                                      //出错{perror("bind error\n");exit(EXIT_FAILURE);}/***  Step 6 : 主循环过程*/sleep(6000);for(;;){/* 接收客户端连接 */int addrlen = sizeof(struct sockaddr);cs = accept(ss,(struct sockaddr*)&client_addr,&addrlen);if(cs < 0)                                    //出错{continue;                                 //结束本次循环}//sleep(30);/*for(;;){size = read(cs,buffer,1024);                 //从套接字中读取数据放到缓冲区buffer中if(size == 0)                               //没有数据{return;}printf("buffer is %s\n", buffer);}
*/}return 0;
}

客户端通过下面脚本并发投递100个:

#!/bin/bashfor i in {1..100}
do
{./tcpclient &
}
done

最终可以看到客户端的打印情况:
在这里插入图片描述
其中104代表连接被对端重置。

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

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

相关文章

鸿蒙入门02-首次安装和配置

注&#xff1a;还没有安装编辑器&#xff08; deveco studio &#xff09;的小伙伴请看鸿蒙入门01-下载和安装-CSDN博客 首次安装配置 编辑器&#xff08; deveco studio &#xff09;安装完毕以后需要进入配置界面进行相关配置配置完毕以后才可以正常使用 环境配置&#xf…

中国人工智能产业年会智能交通与自动驾驶专题全景扫描

中国人工智能产业年会&#xff08;CAIIAC&#xff09;是中国人工智能技术发展和应用的重要展示平台&#xff0c;不仅关注创新&#xff0c;还涵盖了市场和监管方面的内容&#xff0c;对于促进人工智能领域的发展起到了重要作用。年会汇集了来自学术界、工业界和政府的专家&#…

026——项目管理与由来

目录 作者有话说 项目的管理方式 develop分支管理 作者有话说 已经出了25期的文章了&#xff0c;一直没说过我在做个什么。相信大家也有这个以后&#xff0c;作者写了几M的代码到现在不会只是为了点个灯吧。要是这我几十行代码就能解决。 这是一个小故事&#xff0c;老粉丝都…

FILE类与IO流

目录 File类的实例化与常用方法 File类的理解 文件路径的表示方式&#xff1a; API的使用 IO流概述与流的分类 I/O流中的是Input/Output的缩写 IO流的分类&#xff08;不同角度&#xff09; Java程序中的IO流涉及40多个&#xff0c;但实际上都是由4个抽象类衍生出来的。 F…

quartz的使用

简介 是OpenSymphony开源组织在Job scheduling领域又一个开源项目&#xff0c;完全由Java开发&#xff0c;可以用来执行定时任务&#xff0c;类似于java.util.Timer。功能更强大 常规 依赖 <dependency><groupId>org.quartz-scheduler</groupId><arti…

wamp3 安装新的php版本

1&#xff1a;进入地址&#xff1a;Wampserver - Files and addons 下载需要的版本的php 2&#xff1a;运行下载好的文件&#xff0c;例&#xff1a;wampserver3_x64_addon_php7.2.34.exe 3&#xff1a;重启wamp&#xff0c;然后左击&#xff0c;顺序&#xff1a;php/Version…

SpringBoot使用xxl-job分布式任务调度平台定时检测RabbitMQ的消息队列自动发出钉钉警告消息

文章目录 SpringBoot使用xxl-job分布式任务调度平台定时检测RabbitMQ的消息队列自动发出钉钉警告消息1、在pom.xml中导入xxl-job的maven依赖&#xff0c;可以看我这篇文章使用抽离出来的xxl-job的starter2、配置xxl-job的相关配置&#xff0c;若上一步使用了自己创建的starter则…

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

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

RTT学习

定时器的管理方式 在系统启动时需要初始化定时器管理系统。 void rt_system_timer_init(void);如果需要使用SOFT_TIMER&#xff0c;则系统初始化时&#xff0c;应该调用 void rt_system_timer_thread_init(void);定时器控制块中含有定时器相关的重要参数&#xff0c;在定时器…

高标准化及可扩展的产品能力,助力声通科技运营效率不断提升

高标准化及可扩展的产品能力对企业发展具有重要意义&#xff0c;有助于企业提高运营效率、增强市场竞争力&#xff0c;并推动企业实现规模化发展。上海声通信息科技股份有限公司&#xff08;下文称&#xff1a;声通科技或公司&#xff09;作为我国领先的企业级全栈交互式人工智…

ViM-UNet:用于生物医学细分的 Vision Mamba

ViM-UNet&#xff1a;用于生物医学细分的 Vision Mamba 摘要IntroductionMethod and Experiments结果与讨论 ViM-UNet: Vision Mamba for Biomedical Segmentation 摘要 卷积神经网络&#xff08;CNNs&#xff09;&#xff0c;尤其是UNet&#xff0c;是生物医学分割的默认架构…

Java报表是什么?盘点2023最实用的四款Java报表

从字面义就可以推知&#xff0c;Java报表指的是在Java环境下开发或使用的报表工具。Java语言因其功能强大和简单易用的特点&#xff0c;是静态面向对象编程语言的代表&#xff0c;在Java环境开发使用的这些报表工具&#xff0c;可以通过提供可视化操作界面制作报表&#xff0c;…

如果补货机器人也开始搬砖

过去几年&#xff0c;如果一位顾客的欲购商品疑似缺货&#xff0c;“请稍等&#xff0c;我去后台查一下”便是最常听到的一句话。随着过去几年劳动力短缺的加剧&#xff0c;货架并不总像许多人习惯的那样满满当当。为减轻不断补货的负担&#xff0c;使员工可以将精力集中于其他…

LINUX网卡一般性问题分析

一、网卡相关概念 网卡&#xff1a;网卡是一块被设计用来允许计算机在计算机网络上进行通讯的计算机硬件。 网络模型&#xff1a;OSI网络模型、TCP/IP网络模型 LINUX网络收发流程&#xff1a; 1. 内核分配一个主内存地址段&#xff08;DMA缓冲区)&#xff0c;网卡设备可以在…

【微信小程序之分包】

微信小程序之分包 什么是分包分包的好处分包前的结构图分包后的结构图分包的加载规则分包的体积限制使用分包打包原则引用原则独立分包独立分包的配置方法独立分包的引用原则分包预下载配置分包的预下载分包预下载限制 什么是分包 分包指的是把一个完整小程序项目&#xff0c;…

大模型LLM基于本地ollama平台的RAG数据增强的文档问答系统调试

环境&#xff1a;python 3.10.13 1. 加载文档 import bs4 from langchain_community.document_loaders import WebBaseLoader# Only keep post title, headers, and content from the full HTML. bs4_strainer bs4.SoupStrainer(class_("post-title", "post-…

SpringBoot 中获取yml文件的值

获取yml配置文件的值 获取yml配置的值&#xff0c;可以用Value注解去获取 Value("${键名}")使用方法&#xff1a;例如配置文件存放一个学生的信息&#xff1a; student:name: lisiage: 13获取该学生的的name Value("${student.name}")获取yml的值 还可…

2024-14.python前端+Django

第四篇 web前端 第1章 、Web的基本概念 前端基础总共分为三部分&#xff1a;html、css和js。 1.3、HTTP协议 1.3.1 、http协议简介 HTTP协议是Hyper Text Transfer Protocol&#xff08;超文本传输协议&#xff09;的缩写,是用于万维网&#xff08;WWW:World Wide Web &am…

AI人工智能老师大模型讲师叶梓 OneLLM:开创性的多模态大型语言模型技术

在人工智能领域&#xff0c;多模态大型语言模型&#xff08;MLLM&#xff09;的研究一直是一个热门话题。近期&#xff0c;一种名为OneLLM的创新技术引起了业界的广泛关注。OneLLM通过其独特的统一框架&#xff0c;实现了多种不同模态与自然语言的高效对齐&#xff0c;为多模态…

6-129 统计二叉树叶子结点的个数(Python语言描述)

本题要求计算二叉树中有多少片树叶,输出格式见样例。 函数接口定义: #树叶统计 def leafCount(T)其中二叉树类的定义如下: #二叉树的存储-二叉链表 class BinaryTree:#1.构造方法def __init__(self,newValue):self.key = newValue #树根self.left = None #左子…