Raw Socket(二)循环队列收发数据

       完整代码在:
       添加链接描述
       其中tcp_handshake文件夹是实现TCP三次握手的demo。

       完整代码参考:
       https://github.com/praveenkmurthy/Raw-Sockets

       代码实现基于raw socket的TCP协议,发送http请求包并接收回包,解析回包并将payload写入文件,也可使用http get请求直接下载小文件。

演示

       1.请求http服务器

       wireshark抓包:
在这里插入图片描述
       查看写入文件:
在这里插入图片描述

       2.使用get请求下载文件
在这里插入图片描述
       wireshark抓包:
在这里插入图片描述
       查看本地下载文件:
在这里插入图片描述

       3.请求http网站(以2345网址导航为例)
       使用网站测试会出现tcp校验和失败的情况:
在这里插入图片描述
       但是接收http数据包并写入文件是正常的:
在这里插入图片描述

收发数据流程

在这里插入图片描述
在这里插入图片描述
       发送http请求包:

	snprintf(get_command, 1024,"GET %s HTTP/1.1\r\nHost: %s\r\nConnection: keep-alive\r\nAccept: text/html\r\nAccept-Language:en-US\r\n\r\n",get_request_url, dst);

       然后开始发送数据和接收数据,整个过程上面流程图已经描述的很详细了,主要是依靠两个循环队列进行接收和发送数据。
在这里插入图片描述
       循环队列有两个指针,head和tail,tail用来向队列中写入数据,head用于从队列中读取数据。

       发送函数send_data构造数据包并将数据包写入发送循环队列,并向发送线程发送信号,判断发送循环队列是否满队,若满队,则挂起当前线程,等待队不空的信号,若队列不满,循环队列尾指针tail加一。
       发送线程收到信号后从发送循环队列获取数据包,并将当前head指向的数据包地址置空,然后让head加一。判断数据包长度是否大于拥塞窗口和服务端接收窗口的最小值,定时挂起线程,直到拥塞窗口的值更新到大于数据包长度。最后发送数据包,发送数据包函数send_tcp_segment包括超时重传功能,当前发送的数据包若超时未收到回应,则重新发送未收到回应的数据包。

       接收线程收到数据包后,先判断序列号是否正确,然后判断是否是RST包,如果不是并且数据包长度不为0的话,handle_received_data函数处理数据包,即将数据包写入接收循环队列,并发送信号给接收函数receive_data,然后判断接收队列是否队满,如果队满,则挂起线程,等待队不满。如果接收队列队不满的话,tail指针指向下一个空地址,等待下一个数据包的写入。
       接受线程写完接收循环队列后,需判断当前TCP连接的状态,这些状态包括SYN_SENT、ESTABLISHED、FIN_WAIT_1、FIN_WAIT_2、CLOSE_WAIT、CLOSING、LAST_ACK、CLOSED。当TCP状态不是四次握手(即断开连接)过程时,调用process_ack处理服务端回应的数据包,具体做了什么可以看注释。然后发送回应包send_ack_segment(0)。

       接收函数receive_data收到信号得知接收循环队列不为空时,开始从接收循环队列中读取数据,并从packet->offset[DATA_OFFSET]中获取TCP包的数据部分,即原始的http数据包,代码中有chunked和非chunked两种http数据包的处理方式,支持解析http 200响应包和http 302响应包,我把处理302的注释了,因为我暂时不知道怎样构造http 302响应包,嘿嘿。。(挠头)
至于解析http数据包并写入文件或直接下载文件这个逻辑,可以看代码,我注释了一些。大部分http网站内容有base64加密,后面有时间可以加上base64解密功能(遥遥无期。。)

       以上就是Raw Socket(二)循环队列收发数据的基本内容,其中超时重传和拥塞控制功能可以看代码理解,注释我也写了一点,并不难,后面有时间我再补上吧。。。累。。

       欢迎交流!

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

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

相关文章

C# Winform布局控件的几种方式

在 C# WinForms 应用程序中,布局控件和布局管理器可以帮助开发者创建响应式的用户界面,即使在窗口大小改变时也能保持控件的正确位置和尺寸。 通常我们采用Panel和Dock,辅助Anchor实现类似如下的布局。 以下是几种常见的布局控件和方法&…

07:串口通信二

串口编程 1、与波特率之相关的寄存器2、PCON寄存器3、SCON寄存器4、配置的代码分析5、向PC发送一段字符串6、PC机向单片机发送字符控制LED1灯的亮灭 1、与波特率之相关的寄存器 如图,与串口通信相关的寄存器主要是SCON和PCON寄存器。 2、PCON寄存器 SMOD&#xff1…

普通人还有必要学习 Python 之类的编程语言吗?

在开始前分享一些编程的资料需要的同学评论888即可拿走 是我根据网友给的问题精心整理的对于编程的重要性,这里就不详谈了。 未来,我们和机器的交流会越来越多,编程可以简单看作是和机器对话并分发给机器任务。机器不仅越来越强大&#xff0…

java面向对象进阶篇--static

一、前言 java进阶篇已经开始了,先从面向对象开始,由于时间原因今天就只更新了static部分,内容上特别详细,一些特别的注意事项也在反复的提醒大家。 温馨提示一下,往后的java篇会越来越难,希望大家能够坚…

IOS上微信小程序密码框光标离开提示存储密码解决方案

问题: ios密码框输入密码光标离开之后会提示存储密码的弹窗 解决方案 1、在苹果手机上面把 “自动填充密码”关闭,但是苹果这个默认开启,而且大部分客户也不会去自己关闭。 2、欺骗苹果手机,代码实现。 先说解决思路&#xf…

玩转HarmonyOS NEXT之IM应用首页布局

本文从目前流行的垂类市场中,选择即时通讯应用作为典型案例详细介绍HarmonyOS NEXT的各类布局在实际开发中的综合应用。即时通讯应用的核心功能为用户交互,主要包含对话聊天、通讯录,社交圈等交互功能。 应用首页 创建一个包含一列的栅格布…

[图解]SysML和EA建模住宅安全系统-14-黑盒系统规约

1 00:00:02,320 --> 00:00:07,610 接下来,我们看下一步指定黑盒系统需求 2 00:00:08,790 --> 00:00:10,490 就是说,把这个系统 3 00:00:11,880 --> 00:00:15,810 我们的目标系统,ESS,看成黑盒 4 00:00:18,030 --> …

Home Assistant在windows环境安装

Home Assistant是什么? Home Assistant 是一个开源的智能家居平台,旨在通过集成各种智能设备和服务,提供一个统一的、可自定义的家庭自动化解决方案。它可以允许用户监控、控制和自动化家中的各种设备,包括灯光、温度、安全系统、…

公司想无偿裁员,同事赖着不走

关注卢松松,会经常给你分享一些我的经验和观点。 这招好像也不错! 事情是这样的:某公司准备把成本高的员工都裁掉,主要包含研发部和程序员,总共18个人,准备裁掉10人,因为他们工资开的太高了,…

【GD32】从零开始学GD32单片机 | WDGT看门狗定时器+独立看门狗和窗口看门狗例程(GD32F470ZGT6)

1. 简介 看门狗从本质上来说也是一个定时器,它是用来监测硬件或软件的故障的;它的工作原理大概就是开启后内部定时器会按照设置的频率更新,在程序运行过程中我们需不断地重装载看门狗,以使它不溢出;如果硬件或软件发生…

基于pytesseract的OCR图片识别

简介 pytesseract是基于谷歌的tesseract的OCR包,支持识别一些简单的数字、字母、中文。 安装 安装引擎 下载地址:https://digi.bib.uni-mannheim.de/tesseract/ 一般是Windows 64位系统最新版: 如果要识别中文,注意选中中文…

python每日一题:回文数

题干 给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。 回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121 是回文&#xff0…

02:项目二:感应开关盖垃圾桶

感应开关盖垃圾桶 1、PWM开发SG901.1、怎样通过C51单片机输出PWM波?1.2、通过定时器输出PWM波来控制SG90 2、超声波测距模块的使用3、感应开关盖垃圾桶 需要材料: 1、SG90舵机模块 2、HC-SR04超声波模块 3、震动传感器 4、蜂鸣器 5、若干杜邦线 1、PWM开…

LLM-阿里 DashVector + langchain self-querying retriever 优化 RAG 实践【Query 优化】

文章目录 前言self querying 简介代码实现总结 前言 现在比较流行的 RAG 检索就是通过大模型 embedding 算法将数据嵌入向量数据库中,然后在将用户的查询向量化,从向量数据库中召回相似性数据,构造成 context template, 放到 LLM 中进行查询…

【香橙派AiPro】基于VGG16的火灾检测模型预测

目录 引言开发板介绍开发板使用准备工作工具文档 拨码开关镜像烧录连接开发板下载MobaXterm网线-SSH连接开发板设置WIFI连接WIFI-SSH连接开发板确定开发板IP方法 Vnc可视化WindowsiPad 开发工具安装 散热风扇基于VGG16的火灾检测模型预测数据集准备目录结构代码操作 安装宝塔最…

Puppeteer 是什么以及如何在网络抓取中使用它 | 2024 完整指南

网页抓取已经成为任何处理网页数据提取的人都必须掌握的一项重要技能。无论你是开发者、数据科学家还是希望从网站收集信息的爱好者,Puppeteer都是你可以使用的最强大工具之一。本完整指南将深入探讨什么是Puppeteer以及如何有效地在网页抓取中使用它。 Puppeteer简…

【Neural signal processing and analysis zero to hero】- 1

The basics of neural signal processing course from youtube: 传送地址 Possible preprocessing steps Signal artifacts (not) to worry about doing visual based artifact rejection so that means that before you start analyzing, you can identify those data epic…

有关电力电子技术的一些相关仿真和分析:⑤交-直-交全桥逆变+全波整流结构电路(MATLAB/Siumlink仿真)

全桥逆变+全波整流结构 参数:Vin=500V, Vo=200V, T=2:1:1, RL=10Ω, fs=100kHz, L=1mH, C=100uF (1)给定输入电压,输出电压和主电路参数,仿真研究电路工作原理,分析工作时序; (2)调节负载电阻,实现电流连续和断续,并仿真验证; (3)调节占空比,分析占空比与电…

微软Edge浏览器深度解析:性能、安全性与特色功能全面评测

一、引言 自Windows 10操作系统推出以来,微软Edge浏览器作为默认的网页浏览器,凭借其现代化的设计和出色的性能表现,逐渐获得了用户的认可。本文旨在对Edge浏览器进行深入分析,探讨其在多个方面的表现。 二、界面与操作体验 界面…

初识STM32:芯片基本信息

STM32简介 STM32是ST公司基于ARM公司的Cortex-M内核开发的32位微控制器。 ARM公司是全球领先的半导体知识产权(IP)提供商,全世界超过95%的智能手机和平板电脑都采用ARM架构。 ST公司于1987年由意大利的SGS微电子与法国的Thomson半导体合并…