当前位置: 首页 > 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)`发送最后一次读取的不完整的数据块。这样可以确保将整个文件的数据都发送给客户端。

相关文章:

  • 《HelloGitHub》第 91 期
  • V3Det大规模词汇视觉检测数据集与LaRS海上全景障碍物检测数据集
  • HTTP协议及Requests库方法
  • 多线程---阻塞队列+生产者消费者模型
  • 软考高项-基础知识
  • Linux学习第26天:异步通知驱动开发: 主动
  • 框架安全-CVE 复现SpringStrutsLaravelThinkPHP漏洞复现
  • vue中electron与vue通信(fs.existsSync is not a function解决方案)
  • C++ 中的仿函数 functor
  • PHP | php入门知识(if、switch、数组、数组排序、超级全局变量)
  • 6G关键新兴技术- 智能超表面(RIS)技术演进
  • DbVisualizer和DBeaver启动不来,启动报错
  • nodejs+vue食力派网上订餐系统-计算机毕业设计
  • AVL树、红黑树的介绍和实现[C++]
  • Windows 和 Linux 这2个系统在进行编程实现的时候的一些区别:
  • ES2017异步函数现已正式可用
  • MobX
  • SpringBoot几种定时任务的实现方式
  • storm drpc实例
  • 基于Android乐音识别(2)
  • 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
  • 普通函数和构造函数的区别
  • 巧用 TypeScript (一)
  • 首页查询功能的一次实现过程
  • ​Linux·i2c驱动架构​
  • #控制台大学课堂点名问题_课堂随机点名
  • #我与Java虚拟机的故事#连载08:书读百遍其义自见
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • (17)Hive ——MR任务的map与reduce个数由什么决定?
  • (3)(3.5) 遥测无线电区域条例
  • (32位汇编 五)mov/add/sub/and/or/xor/not
  • (4)事件处理——(2)在页面加载的时候执行任务(Performing tasks on page load)...
  • (C#)一个最简单的链表类
  • (delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(封装和窗体)
  • (Repost) Getting Genode with TrustZone on the i.MX
  • (笔试题)分解质因式
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (免费领源码)python+django+mysql线上兼职平台系统83320-计算机毕业设计项目选题推荐
  • (十八)devops持续集成开发——使用docker安装部署jenkins流水线服务
  • .describe() python_Python-Win32com-Excel
  • .NET CORE使用Redis分布式锁续命(续期)问题
  • .NET Micro Framework初体验(二)
  • .NET MVC、 WebAPI、 WebService【ws】、NVVM、WCF、Remoting
  • .NET 材料检测系统崩溃分析
  • .net 前台table如何加一列下拉框_如何用Word编辑参考文献
  • .NET序列化 serializable,反序列化
  • ??eclipse的安装配置问题!??
  • @Mapper作用
  • [BetterExplained]书写是为了更好的思考(转载)
  • [BUG]vscode插件live server无法自动打开浏览器
  • [C#]OpenCvSharp结合yolov8-face实现L2CS-Net眼睛注视方向估计或者人脸朝向估计
  • [CTF]2022美团CTF WEB WP
  • [Docker]十二.Docker consul集群搭建、微服务部署,Consul集群+Swarm集群部署微服务实战
  • [FZSZOJ 1223] 上海红茶馆
  • [Go WebSocket] 多房间的聊天室(五)用多个小锁代替大锁,提高效率