写点什么

C++|TCP 服务端中接收文件

  • 2022 年 7 月 06 日
  • 本文字数:993 字

    阅读完需:约 3 分钟

C++|TCP 服务端中接收文件

讲解了如何使用 TCP 客户端发送文件,那么服务端是如何接收的呢?

今天就来讲解下这个功能吧!

服务器接收客户端发送的文件信息

1:定义接收数据结构体

首先,我们需要记录文件信息,也就是文件名称、文件大小以及已经接收的文件大小。数据量较多,这里采用的结构体进行存储。

客户端与服务器一般都是多对一的关系,我们在服务端这边记录客户端数据时采用了 std::vector<ServerDeviceFilesInforSt> m_vetInfo 成员变量。根据实际使用习惯可以定义其他容器比如:map、list

2:记录客户端发送的文件信息

首先,从众多的客户端中查询出当前发送消息的客户端

当我们查询到匹配客户端后,如果当前在结构体中记录的总体文件大小 ==0 时,说明是第一次存储文件的基本情况,解析数据并进行存储

if(itFind->nTotalFileSize == 0){  //说明:该编号的客户端文件属于第一次存储  int nTotalFilesSize = 0;  std::string sFileName = "";  /*  解析客户端发送的内容并获取有效数据,文件名称以及大小  这里不做说明  */   //将解析的内容进行存储   itFind->sFileName = sFileName;   itFind->nTotalFileSize = nTotalFilesSize;   itFind->nReceivedSize = 0; //未进行数据接收   //创建文件并打开   std::string sSavePath = "这是当前文件的路径,并是已经创建好的";   itFind->writeFile = fopen(sSavePath, "wb");   itFind->sSavePath = sSavePath;}
复制代码

3:记录实际文件信息

当结构体中的文件总体大小不为 0 时,说明正在接收实际的有效数据

获取接收真实的文件大小

int nJsonSize = (unsigned char)data[24] * 256 * 256 + (unsigned char)data[25] * 256 + (unsigned char)data[26];
复制代码

将接收的内容存储到文件指针中存储

fwrite(data + 27, sizeof(char), nJsonSize, itFind->writeFile);
复制代码

记录到文件指针后记录已经接收的实际长度

itFind->nReceivedSize += nJsonSize;
复制代码

服务端记录的文件大小 <= 接收的大小时,说明文件接收完成

if(itFind->nTotalFileSize <= itFind->nReceivedSize){  fclose(itFind->writeFile); //关闭当前文件  //文件关闭后清空结构体中的数据  itFind->nTotalFileSize = 0;  itFind->nReceivedSize = -1;  itFind->sSavePath = "";  itFind->sFileName = "";}
复制代码

这样就可以实现第一次接收的是文件名称以及大小,以后的接收的数据是实际的文件内容了。

以上便是服务端接收的实际操作。

我是中国好公民 st,一名 C++开发程序媛~

发布于: 刚刚阅读数: 3
用户头像

书山有路勤为径,学海无涯苦作舟 2022.07.01 加入

擅长语言:C++ 涉及语言:Python

评论

发布
暂无评论
C++|TCP 服务端中接收文件_c++_中国好公民st_InfoQ写作社区