当前位置: 首页 > 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代表平均值,然后西格玛代表标准差,知道了 这两个…...

<6>-MySQL表的增删查改

目录 一&#xff0c;create&#xff08;创建表&#xff09; 二&#xff0c;retrieve&#xff08;查询表&#xff09; 1&#xff0c;select列 2&#xff0c;where条件 三&#xff0c;update&#xff08;更新表&#xff09; 四&#xff0c;delete&#xff08;删除表&#xf…...

51c自动驾驶~合集58

我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留&#xff0c;CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制&#xff08;CCA-Attention&#xff09;&#xff0c;…...

Java 8 Stream API 入门到实践详解

一、告别 for 循环&#xff01; 传统痛点&#xff1a; Java 8 之前&#xff0c;集合操作离不开冗长的 for 循环和匿名类。例如&#xff0c;过滤列表中的偶数&#xff1a; List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

Admin.Net中的消息通信SignalR解释

定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

C++ 基础特性深度解析

目录 引言 一、命名空间&#xff08;namespace&#xff09; C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用&#xff08;reference&#xff09;​ C 中的引用​ 与 C 语言的对比​ 四、inline&#xff08;内联函数…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)

骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术&#xff0c;它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton)&#xff1a;由层级结构的骨头组成&#xff0c;类似于人体骨骼蒙皮 (Mesh Skinning)&#xff1a;将模型网格顶点绑定到骨骼上&#xff0c;使骨骼移动…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)

本文把滑坡位移序列拆开、筛优质因子&#xff0c;再用 CNN-BiLSTM-Attention 来动态预测每个子序列&#xff0c;最后重构出总位移&#xff0c;预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵&#xff08;S…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

网站指纹识别

网站指纹识别 网站的最基本组成&#xff1a;服务器&#xff08;操作系统&#xff09;、中间件&#xff08;web容器&#xff09;、脚本语言、数据厍 为什么要了解这些&#xff1f;举个例子&#xff1a;发现了一个文件读取漏洞&#xff0c;我们需要读/etc/passwd&#xff0c;如…...

mac 安装homebrew (nvm 及git)

mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用&#xff1a; 方法一&#xff1a;使用 Homebrew 安装 Git&#xff08;推荐&#xff09; 步骤如下&#xff1a;打开终端&#xff08;Terminal.app&#xff09; 1.安装 Homebrew…...