当前位置: 首页 > news >正文

博客摘录「 TCP/IP网络编程——习题答案」2023年10月29日

clnt_sd=accept(serv_sd, (struct sockaddr*)&clnt_adr, &clnt_adr_sz);read(clnt_sd, file_name, BUF_SIZE);   fp=fopen(file_name, "rb");           //尝试打开客户端请求的文件if(fp!=NULL)              //如果文件存在,则传送给客户端{while(1){read_cnt=fread((void*)buf, 1, BUF_SIZE, fp);if(read_cnt<BUF_SIZE){write(clnt_sd, buf, read_cnt);break;}write(clnt_sd, buf, BUF_SIZE);}}

 

在C++中,`fread`是一个函数,用于从文件中读取数据。它的原型如下:

size_t fread(void* ptr, size_t size, size_t count, FILE* stream);

其中,`ptr`是一个指向存储读取数据的内存块的指针;`size`是每个数据块的字节数;`count`是要读取的数据块数;`stream`是一个指向要读取的文件的指针。

`fread`函数将从文件中读取`count`个数据块,每个数据块的大小为`size`字节,然后将这些数据存储到`ptr`指向的内存块中。函数返回实际读取的数据块数,如果读取失败或到达文件末尾,返回的值可能小于`count`。

以下是一个使用`fread`函数读取二进制文件的示例:

#include <iostream>
#include <cstdio>int main() {FILE* fp = std::fopen("data.bin", "rb");if (fp == nullptr) {std::perror("Failed to open file");return 1;}int buffer[4];std::size_t count = std::fread(buffer, sizeof(int), 4, fp);if (count != 4) {std::perror("Failed to read file");return 1;}for (int i = 0; i < 4; ++i) {std::cout << buffer[i] << " ";}std::fclose(fp);return 0;
}

在上面的示例中,我们打开了一个名为"data.bin"的二进制文件,并使用`fread`函数读取了其中的4个整数。`fread`函数将这些整数存储到`buffer`数组中,然后我们将这些整数输出到控制台。需要注意的是,我们使用了"rb"作为打开文件的方式,以确保文件以二进制方式打开。

上述代码的含义是:

1. `clnt_sd=accept(serv_sd, (struct sockaddr*)&clnt_adr, &clnt_adr_sz);`:通过服务器套接字`serv_sd`接受客户端的连接请求,并创建一个新的套接字`clnt_sd`来与客户端进行通信。这个函数用于服务器端接受客户端的连接请求。

2. `read(clnt_sd, file_name, BUF_SIZE);`:从已连接的套接字`clnt_sd`中读取客户端发送的文件名,并将其存储到`file_name`变量中。

3. `fp=fopen(file_name, "rb");`:尝试以只读二进制方式打开客户端请求的文件。如果文件存在,则返回一个指向该文件的文件指针`fp`。

4. `if(fp!=NULL)`:如果文件指针`fp`不为空,即文件存在,则执行下面的代码块。

5. `while(1)`:无限循环,用于从文件中读取数据并发送给客户端。

6. `read_cnt=fread((void*)buf, 1, BUF_SIZE, fp);`:从文件中读取最多`BUF_SIZE`字节的数据,并将其存储到缓冲区`buf`中。`fread`函数返回实际读取的字节数。

7. `if(read_cnt<BUF_SIZE)`:如果实际读取的字节数小于`BUF_SIZE`,说明已经读取到了文件末尾。

8. `write(clnt_sd, buf, read_cnt);`:将从文件中读取的数据通过已连接的套接字`clnt_sd`发送给客户端。

9. `break;`:跳出循环,结束文件传输。

10. `write(clnt_sd, buf, BUF_SIZE);`:将从文件中读取的数据块`buf`通过已连接的套接字`clnt_sd`发送给客户端。

综合起来,这段代码的作用是服务器端接受客户端连接请求,读取客户端发送的文件名,并尝试打开该文件。如果文件存在,则从文件中读取数据并通过已连接的套接字发送给客户端。这段代码适用于服务器端响应客户端下载文件的请求。

在服务器向客户端发送文件数据时,可能存在以下两种情况:

1. 文件大小正好是`BUF_SIZE`的整数倍:此时每次从文件中读取`BUF_SIZE`字节的数据块,并使用`write(clnt_sd, buf, BUF_SIZE)`将数据块发送给客户端。

2. 文件大小不是`BUF_SIZE`的整数倍:此时最后一次从文件中读取的数据块大小可能小于`BUF_SIZE`,因此需要使用`write(clnt_sd, buf, read_cnt)`将实际读取的数据块发送给客户端。

因此,在`while`循环中需要使用两次`write`函数,分别处理上述两种情况。第一次使用`write(clnt_sd, buf, BUF_SIZE)`发送完整的数据块,第二次使用`write(clnt_sd, buf, read_cnt)`发送最后一次读取的不完整的数据块。这样可以确保将整个文件的数据都发送给客户端。

相关文章:

博客摘录「 TCP/IP网络编程——习题答案」2023年10月29日

clnt_sdaccept(serv_sd, (struct sockaddr*)&clnt_adr, &clnt_adr_sz);read(clnt_sd, file_name, BUF_SIZE); fpfopen(file_name, "rb"); //尝试打开客户端请求的文件if(fp!NULL) //如果文件存在&#xff0c;则传送给客户端{while(…...

MySQL数据库干货_13—— MySQL查询数据

MySQL查询数据 SELECT基本查询 SELECT语句的功能 SELECT 语句从数据库中返回信息。使用一个 SELECT 语句&#xff0c;可以做下面的事&#xff1a; 列选择&#xff1a;能够使用 SELECT 语句的列选择功能选择表中的列&#xff0c;这些列是想 要用查询返回的。当查询时&#xf…...

Docker Consul概述及构建

Docker Consul概述及构建 一、Consul概述1.1、什么是Consul1.2、consul 容器服务更新与发现1.3、服务注册与发现的含义1.4、consul-template概述1.5、registrator的作用 二、consul部署2.1、环境配置2.2、在主节点上部署consul2.3 、配置容器服务自动加入nginx集群2.3.1、安装G…...

《Linux从练气到飞升》No.25 Linux中多线程概念

&#x1f57a;作者&#xff1a; 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux菜鸟刷题集 &#x1f618;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 &#x1f3c7;码字不易&#xff0c;你的&#x1f44d;点赞&#x1f64c;收藏❤️关注对我真的…...

2021~2023年度长垣起重机博览会最佳产品彩页(修订中)

1.河南恒达 比较完善的起重量限制器产品线分类&#xff0c;提供了监控参数一览表。 2.沪源电机 详细的电机参数&#xff0c;这基本上可以作为电机发展的历史资料来搜集。 3.英威腾 详细的变频器功能 4.杭州浙起 详尽的电动葫芦结构展示&#xff0c;电动葫芦参数展示 5.…...

OpenCV标定演示,及如何生成标定板图片

标定的程序在官方的源码里有&#xff0c; opencv-4.5.5\samples\cpp\tutorial_code\calib3d\camera_calibration 很多小白不知道怎么跑起来&#xff0c;这个也怪OpenCV官方&#xff0c;工作没做完善&#xff0c;其实的default.xml是要自己手动改的&#xff0c;输入的图片也要…...

python venv 虚拟环境使用

查看py版本python --version 创建虚拟环境 venvdemopython -m venv venvdemo 启动虚拟环境创建好虚拟环境后&#xff0c;当前目录会出现 venvdemo文件夹 cd envdemo\Scripts 执行 ./activate 文件 进入虚拟环境 关闭虚拟环境deactivate 如何查看Python虚拟环境位置python -c …...

useCallback和useMemo的区别?

文章目录 前言useCallbackuseMemouseCallback除了缓存回调函数还可以做什么操作&#xff1f;后言 前言 hello world欢迎来到前端的新世界 &#x1f61c;当前文章系列专栏&#xff1a;react.js &#x1f431;‍&#x1f453;博主在前端领域还有很多知识和技术需要掌握&#xff0…...

Angular组件生命周期详解

当 Angular 实例化组件类 并渲染组件视图及其子视图时&#xff0c;组件实例的生命周期就开始了。生命周期一直伴随着变更检测&#xff0c;Angular 会检查数据绑定属性何时发生变化&#xff0c;并按需更新视图和组件实例。当 Angular 销毁组件实例并从 DOM 中移除它渲染的模板时…...

Redsync 多 Redis 实例使用 demo

完整代码传送门 package mainimport ("context""fmt""net/http""redis-distributed-lock/redis_client""strconv""github.com/go-redsync/redsync/v4""github.com/go-redsync/redsync/v4/redis/goredis/v9&…...

Docker(1)——安装Docker以及配置阿里云镜像加速

目录 一、简介 二、安装Docker 1. 访问Docker官网 2. 卸载旧版本Dokcer 3. 下载yum-utils&#xff08;yum工具包集合&#xff09; 4. 设置国内镜像仓库 5. 更新yum软件包索引 6. 安装Docker 7. 启动Docker 8. 卸载Docker 三、阿里云镜像加速 1. 访问阿里云官网 2. …...

MCU HardFault_Handler调试方法

一.获取内核寄存器的值 1.在MDK的DEBUG模式下&#xff0c;当程序出现跑飞后&#xff0c;确定卡死在HardFault_Handler中断处 2. 通过Register窗口读取LR寄存器的值来确定当前系统使用堆栈是MSP还是PSP LR寄存器值堆栈寄存器0xFFFFFFF9MSP寄存器0xFFFFFFFDPSP寄存器 如下图所…...

【深度学习】AUTOMATIC1111 / stable-diffusion-webui docker

代码&#xff1a;https://github.com/AUTOMATIC1111/stable-diffusion-webui/ CUDA 11.8 制作了一个镜像&#xff0c;可以直接开启stable diffusion的web ui 服务。 确定自己的显卡支持CUDA11.8&#xff0c;启动此镜像方式&#xff1a; docker run -it --networkhost --gpu…...

[Hive] 查询结果保存

文章目录 1.插入新表追加 2.插入hdfs文件系统 1.插入新表 使用INSERT OVERWRITE语句的情况&#xff1a; 整个表&#xff1a;可以使用INSERT OVERWRITE TABLE table_name语句将查询结果直接覆盖整个表中的数据。 INSERT OVERWRITE TABLE table_name SELECT * FROM ...特定分区…...

Es中出现unassigned shards问题解决

1、一般后台会报primary shard is not active Timeout: … 出现这种问题表示该索引是只读了&#xff0c;没办法进行shard及存储操作&#xff0c;优先排除是系统存储盘满了 2、通过监控工具查看(cerebro) 发现该索引shard 1 损坏 也可以通过命令进行查看 GET _cluster/allo…...

RT-DERT:在实时目标检测上,DETRs打败了yolo

文章目录 摘要1、简介2. 相关研究2.1、实时目标检测器2.2、端到端目标检测器2.3、用于目标检测的多尺度特征 3、检测器的端到端速度3.1、 NMS分析3.2、端到端速度基准测试 4、实时DETR4.1、模型概述4.2、高效的混合编码器4.3、IoU-aware查询选择4.4、RT-DETR的缩放 5、实验5.1、…...

uniapp/H5富文本复制文本功能

代码实现&#xff1a; copy() {let replacedContent this.form.resTaskBaseInfoDetail.content;let text readHtml(replacedContent)// #ifdef H5let textarea document.createElement("textarea")textarea.value texttextarea.readOnly "readOnly"d…...

通付盾Web3专题 | 智能账户:数字时代基础单元

2008年10月31日&#xff0c;中本聪&#xff08;Satoshi Nakamoto&#xff09;在P2P foundation 网站发布比特币白皮书《比特币&#xff1a;一种点对点的电子现金系统》。转眼距比特币白皮书发布已过去15年。2009年1月比特币网络正式推出&#xff0c;当时每个比特币的价格仅为0.…...

java网上阅读网站系统eclipse定制开发mysql数据库BS模式java编程jdbc

一、源码特点 JSP 网上阅读网站系统是一套完善的web设计系统&#xff0c;对理解JSP java SSM框架 mvc编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,eclipse开发&#xff0c;数据库为Mysql5.0&a…...

人工智能基础_机器学习007_高斯分布_概率计算_最小二乘法推导_得出损失函数---人工智能工作笔记0047

这个不分也是挺难的,但是之前有详细的,解释了,之前的文章中有, 那么这里会简单提一下,然后,继续向下学习 首先我们要知道高斯分布,也就是,正太分布, 这个可以预测x在多少的时候,概率最大 要知道在概率分布这个,高斯分布公式中,u代表平均值,然后西格玛代表标准差,知道了 这两个…...

ThingsCloud事物云平台搭建-微信小程序

ThingsCloud云平台与微信小程序设计 本文主要是介绍ThingsCloud云平台的搭建及微信小程序与app的使用。 当前文章是作为一个通用案例,介绍如何快速使用 ThingsCloud云平台 以及 利用 ThingsCloud云平台平台的框架快速设计手机APP和微信小程序。 可以快速让硬件接入,实现硬件…...

【Go语言基础【5】】Go module概述:项目与依赖管理

文章目录 一、Go Module 概述二、Go Module 核心特性1. 项目结构2. 依赖查找机制 三、如何启用 Go Module四、创建 Go Module 项目五、Go Module 关键命令 一、Go Module 概述 Go Module 是 Go 1.11 版本&#xff08;2018 年 8 月&#xff09;引入的依赖管理系统&#xff0c;用…...

场景题-3

如何实现一个消息队列 拆解分析主流的几种消息队列 1、基本架构 生产者Producer、消费者Consumer、Broker&#xff1a;生产者发送消息&#xff0c;消费者接受消息&#xff0c;Broker是服务端&#xff0c;处理消息的存储、备份、删除和消费关系的维护。 主题和分区&#xff…...

Podman 和 Docker

Podman 和 Docker 都是容器化工具&#xff0c;用于创建、运行和管理容器。它们有很多相似之处&#xff0c;但也存在关键区别。下面从多个维度对比它们&#xff0c;并给出适用场景建议。 1. 核心区别 特性DockerPodman守护进程&#xff08;Daemon&#xff09;必须运行 dockerd …...

Vue 3 弹出式计算器组件(源码 + 教程)

&#x1f9ee; Vue 3 弹出式计算器组件&#xff08;源码 教程&#xff09; &#x1f4cc; 建议收藏 点赞 关注&#xff0c;本组件支持加减乘除、双向绑定、计算过程展示&#xff0c;适用于表单辅助输入场景。 &#x1f527; 一、完整源码&#xff08;复制即用&#xff09; …...

[蓝桥杯]通电

通电 题目描述 2015 年&#xff0c;全中国实现了户户通电。作为一名电力建设者&#xff0c;小明正在帮助一带一路上的国家通电。 这一次&#xff0c;小明要帮助 nn 个村庄通电&#xff0c;其中 1 号村庄正好可以建立一个发电站&#xff0c;所发的电足够所有村庄使用。 现在…...

STM32:CAN总线精髓:特性、电路、帧格式与波形分析详解

声明&#xff1a;此博客是我的学习笔记&#xff0c;所看课程是江协科技的CAN总线课程&#xff0c;知识点都大同小异&#xff0c;我仅进行总结并加上了我自己的理解&#xff0c;所引案例也都是课程中的案例&#xff0c;希望对你的理解有所帮助&#xff01; 知识点1【CAN总线的概…...

Tika Server:企业级文档内容解析的轻量级服务化方案

目录 Tika Server&#xff1a;企业级文档内容解析的轻量级服务化方案 一、什么是 Tika Server&#xff1f; 二、Tika Server 的功能特点 1. 多种文档格式支持 2. 提取结构化信息 3. RESTful 接口设计 三、是否开源&#xff1f;是否支持私有化部署&#xff1f; 四、部署…...

OrCAD X Capture CIS设计小诀窍系列第二季--03.如何在Capture中输出带有目录和元器件信息的PDF

背景介绍&#xff1a;我们在进行原理图设计时&#xff0c;经常需要输出PDF来查看或评审&#xff0c;但通过”Print”功能导出的PDF较为简单&#xff0c;只能查看设计视图&#xff1b;而通过使用Ghostscript软件可以输出带有目录和元器件信息的PDF&#xff0c;让设计师可以直接在…...

#开发环境篇:postMan可以正常调通,但是浏览器里面一直报403

本地header代理下面内容即可 headers: { // 添加必要的请求头 ‘Host’: ‘服务端域名’, ‘Origin’: https://服务端域名, ‘Referer’: https://服务端域名 }, devServer: {// 本地开发代理API地址proxy: {^/file: {target: https://服务端域名,changeOrigin: true, // 是否…...