收藏 分享(赏)

云计算的关键技术与应用实例.doc

上传人:hyngb9260 文档编号:6963641 上传时间:2019-04-28 格式:DOC 页数:96 大小:252KB
下载 相关 举报
云计算的关键技术与应用实例.doc_第1页
第1页 / 共96页
云计算的关键技术与应用实例.doc_第2页
第2页 / 共96页
云计算的关键技术与应用实例.doc_第3页
第3页 / 共96页
云计算的关键技术与应用实例.doc_第4页
第4页 / 共96页
云计算的关键技术与应用实例.doc_第5页
第5页 / 共96页
点击查看更多>>
资源描述

1、云计算的关键技术与应用实例.txt 世上有三种人:一是良心被狗吃了的人,二是良心没被狗吃的人,三是良心连狗都不吃的人。丶 爱情是个梦,而我却睡过了头第一篇从并行计算到云计算第 1 章并行计算与云计算 21.1 并行计算到云计算的演变 21.2 云计算需要定义吗?. 41.3 云计算是否是新瓶装旧酒 51.4 MPI 与 Hadoop,不同学科学者的选择 61.5 云计算与浏览器. 8第 2 章 MPI 并行计算环境的建立. 102.1 配置前的准备工作 102.2 挂载 NFS 文件系统. 112.3 配置 ssh 实现 MPI 节点间用户的无密码访问 122.4 安装 MPICH2. 122

2、.5 建立并行计算环境时的注意事项. 14第 3 章并行计算时代的程序设计方法. 153.1 最简单的并行程序 153.2 获取进程标志和机器名. 183.3 有消息传递功能的并行程序. 203.4 Monte Carlo 法在并行程序设计中的应用. 233.5 并行计算中节点间的Reduce 操作. 253.6 用 MPI 的 6 个基本函数实现Reduce 函数功能 283.7 计算与通信的并行 303.8 节点间自定义复杂数据结构的传输 343.9 MPI 与 MySQL 数据库的结合应用. 373.10 设计 MPI 并行程序时的注意事项. 41第 4 章从 MPI 走向云计算. 43

3、4.1 MPI 没有分布式文件系统支持 434.2 MPI 无法应对节点的失效 444.3 假如用 MPI 来构建云计算系统. 44第二篇云计算的关键技术第 5 章 Map/Reduce 是云计算的选择吗. 485.1 Map/Reduce 跨越 50 年的历史. 485.2 实现 Map/Reduce 的 C 语言实例. 495.3 采用 MPI 实现并行化的Map/Reduce 功能 51第 6 章 Hadoop 技术 586.1 Hadoop 与 MPI 在数据处理上的对比. 586.2 Hadoop 的主从式结构. 596.2.1 主从式文件系统 HDFS. 596.2.2 主从式计算

4、系统Map/Reduce 606.2.3 文件分块策略分析 616.3 Hadoop 文件系统 HDFS 的前辈 GFS. 646.4 构建云文件系统需要解决的关键问题. 666.5 云计算不相信节点服务器 676.6 揭密云计算架构下的典型服务器Google 服务器. 686.6.1 Google 服务器概述. 686.6.2 揭开 Google 服务器的神秘面纱 696.6.3 Google 服务器的配置情况. 696.6.4 Google 服务器的性能评测. 73第 7 章 Hadoop 环境的建立 757.1 Hadoop 配置环境. 757.2 配置 ssh 实现 Hadoop 结点

5、间用户的无密码访问 767.3 JDK 的安装配置. 767.4 Hadoop 的安装配置 777.5 Hadoop 中的 Hello World. 817.6 C 语言程序在 Hadoop上运行 82第 8 章动手做自己的云计算V0.01 系统. 868.1 系统总体分析 868.1.1 系统架构. 868.1.2 文件分布式存储流程. 888.1.3 计算与存储的整合流程 888.2 管理节点程序设计与分析 898.2.1 管理节点服务器程序主函数 908.2.2 管理节点各线程函数的设计 938.2.3 主服务器中其他函数的设计 958.3 子节点程序分析. 988.3.1 子节点主函数

6、. 998.3.2 子节点各线程函数设计 1028.4 客户端 API 设计. 1078.4.1 客户端文件的存储 1088.4.2 客户端启动子节点计算. 1138.4.3 客户端应用的简单实例. 1148.5 客户端应用开发实例 115第三篇云计算应用实例第 9 章基于不可信服务器节点的云计算基础架构. 1189.1 云计算基础架构的应用场景 1189.2 云计算基础架构 1209.3 基于单向指针目录映射的分层用户隔离 1219.4 云文件系统的物理存储管理 1239.5 云存储的安全级别划分 1249.6 计算和存储的整合. 1259.7 计算和存储的迁移. 1269.8 任务的可并行

7、性和分类分析 1279.9 简化的服务器级粗粒度计算和存储资源分配方案. 1309.10 数据的云计算系统之旅 133第 10 章云计算与智能 13510.1 云计算的智能与人类智能的比较 13510.2 云计算提升终端智能. 13610.3 云计算智能与 Monte Carlo方法 13810.4 云计算时代不确定性智能算法示例模拟谐振子算法. 13810.4.1 简谐振动的描述 13910.4.2 模拟谐振子算法描述 14110.4.3 模拟谐振子算法流程 14410.4.4 模拟谐振子算法分析 14610.4.5 模拟谐振子算法应用于旅行商问题. 14910.4.6 模拟谐振子算法在连续

8、和非线性优化问题中的应用 16110.4.7 模拟谐振子算法的隐含并行性. 16210.5 云计算中的人工智能. 162第 11 章云计算企业之间的竞争性分析. 16411.1 云计算技术流派分析 16411.1.1 存储型数据密集云计算平台 16411.1.2 计算型计算密集云计算平台 16511.1.3 综合云计算平台 16511.2 国际云计算公司分析 16511.2.1 云计算技术的提出者Google 16611.2.2 “端”的霸主微软. 16611.2.3 蓝色巨人 IBM 的蓝云 16711.2.4 云计算的市场先行者Amazon 公司. 16811.2.5 Salesforce

9、 从 SaaS 走入云中 16811.2.6 热爱白皮书的 Sun. 16911.2.7 EMC 云计算的核心是虚拟化. 17011.2.8 渔翁得利的思科 17011.3 国内云计算公司分析 17111.3.1 拥有基础设施的世纪互联 17111.3.2 阿里巴巴下决心入云 17211.3.3 中国移动的 BigCloud 17211.3.4 国产旗帜友友云计算平台 17311.3.5 曙光高性能与云计算 17311.3.6 展览也要云. 17311.4 开源云计算平台分析 17411.5 国际国内云计算平台提供商对比研究 17511.6 产业综合分析 17911.6.1 云计算与网络设备商

10、的关系 17911.6.2 云计算与移动通讯运营商的关系. 18011.6.3 云计算与服务器提供商的关系. 18011.6.4 云计算与应用程序开发商的关系. 181后记:未来的计算机不确定性和隐含并行计算 182附录:计算力的标准 Linpack 测试详细指南. 186参考文献 196面对云计算,有的人越来越糊涂,经常听到有人用云里雾里来形容现在的云计算。云计算系统确实是一个庞大和综合的系统,即使是国际大公司也不敢贸然进军云计算领域,大量的企业不是将自己的传统技术优势称为云计算,就是雷声大雨点小的观望。一般开发者更是不适应在机群的环境下工作,所以本章将用一个简单的例子来展现云计算的基本特点

11、和技术开发方式,我们并不保证这个系统是一个完善的系统,但它具备了云计算的一些基本特点如计算和存储的整合、计算向存储的迁移、文件的分布式存储、计算的并行化等,我们对这些功能采用了最简单的实现方法以使大多数读者能从中体会到云计算技术的核心理念,所以我们命名这个系统为云计算 V0.01,运行环境为 Windows。8.1系统总体分析我们进行系统总体结构设计时主要着眼于云计算基本特征的实现,不考虑系统中很多细节性的要求和高级要求,并采用中等水平的读者能完成的难度设计。设计需要实现的基本功能如下。(1)向开发云应用的客户提供可以调用的 API 函数,利用 API 函数实现对云计算系统的访问。(2)实现分

12、布式的文件存储。(3)实现计算向存储的迁移,使计算和存储在同一个节点完成,避免数据在网络中的传送。(4)向用户隔离计算的并行性和存储的分布性,用户无需关心系统具体的操作过程。(5)初步实现对数据求和及求最大值的处理,演示云计算的基本特点。读者可以通过增加处理函数实现更多的计算功能。8.1.1系统架构云计算 V0.01 系统是一个完全模型化的实验用系统,开发和运行环境为 Windows 系统,通过对该系统的学习使读者对云计算技术的基本要点有一定的了解,云计算 V0.01 将云计算设备分为3 个角色:管理节点、子节点和客户端。管理节点和子节点构成了云计算的服务器端,客户端通过对 API 的调用实现

13、对云计算系统的访问,并通过 API 整合为不同的应用程序。为了简化系统的设计难度,我们在做云计算 V0.01 时限定所做的计算任务包括对大数据量数组求和、求最大值等操作,读者可通过实际的系统体会存储的分布化与计算的并行化的关系,并理解计算向存储迁移的作用。云计算 V0.01 没有实现存储的副本策略,因此暂时不能处理节点失效的问题,这也是为了降低系统难度的需要。以下的系统架构方法仅供参考和学习,并且不代表我们赞成这一架构,不同的读者可以设计不同的系统架构。系统的整个架构如图 8.1 所示,这种架构方式是一个以客户端为核心的架构方法,系统中的所有操作指令均由客户端发出,管理节点不和任一子节点作数据

14、和指令的通信,管理节点的作用主要是维护 root.dat 和 node.dat 两个系统文件。root.dat 文件存储着现在系统中已注册的用户名及该用户所对应的文件分块描述文件所在节点的 IP 地址,系统利用这一文件可实现用户的注册、认证及用户登录后获得文件分块描述文件所在节点的 IP 地址。node.dat 文件则维护着整个云计算系统所有子节点的 IP 地址、端口、最大空间、剩余空间等信息,客户端通过该文件能够获得整个机群的信息,从而实现向各子节点的直接连接。客户端从管理节点获得了相关的系统信息后将根据这一信息直接向各个子节点发起连接,完成文件存储及计算的功能,这大大提高了数据传输的速率,

15、减轻了管理节点的负荷。各用户文件的具体分块和存储方式被系统用该用户的用户名(username)作为文件名的文件分块描述文件存储于其中的一个子节点,这一子节点的 IP可在root.dat 文件中找到。图 8.1 云计算 V0.01 的系统结构在云计算 V0.01 系统中不同角色间存在两类数据的传送:一类是命令数据 CMD,管理节点和子节点通过命令数据判断自己下一步所要完成的任务;一类是信息数据,这类数据是系统要完成相关任务所需要数据,如系统描述信息、文件信息等,这类数据的数据量相对较大。由于采用了计算向存储的迁移策略,系统中出现用户文件数据传输的情况很少,这大大提高了系统的运行效率。8.1.2文

16、件分布式存储流程系统在进行文件存储时先通过客户端连接管理节点,读取 root.dat 文件数据,检验是否有该用户存在,并获取用户数据块文件所在节点的 IP 地址。通过读取 node.dat 文件从管理节点读取子节点的 IP 地址的列表,根据以上信息完成对数据的分割,启动多线程函数同时连接各子节点将数据分别保存在各个节点上,最后更新 username 表以备访问时重新找到文件的分布情况。uesername文件将被存储于某一节点上,管理节点会根据现有 username 文件的分布情况向用户分配一个节点的 IP 地址存放 username 文件,文件名就是该用户的用户名,由于用户名在系统中是惟一的,

17、所以每个用户的 username 也是惟一的,不会造成混乱,如图 8.2 所示。图 8.2 文件的分布式存储流程8.1.3计算与存储的整合流程如图 8.3 所示,在云计算 V0.01 系统中,我们利用获得的用户名、文件名、数据块号以及数据分块信息文件的 IP 地址信息,可以惟一地确定任一数据块的位置和文件名,客户端同时向各个子节点发送启动计算的命令,各节点就地读取数据块本地文件,并对其进行计算,计算完成后发送回客户端汇总得到最后的结果。图 8.3 计算与存储的整合流程这一计算过程不用移动任何数据,对于数据的处理就在存储数据块的节点完成,系统根据客户端的指令,将计算迁移到节点上分布式的完成,大大

18、提高了计算效率,避免了数据在网络中的大量流动所造成的效率下降,对于海量数据来说,这一做法的效果是相当明显的。对于不同的数据,我们可以定义不同的数据处理方法,从而扩展系统的应用领域。8.2管理节点程序设计与分析管理节点在云计算 V0.01 系统中只与客户端进行通信,存储系统中的节点信息和用户注册信息,并不负责任务的调度工作。在管理节点我们将保存 root.dat 和 node.dat 两个系统信息文件。root.dat 文件保存用户名及该用户文件系统所在的子节点的 IP 地址,采用 userInfo 数据结构来描述。客户端程序只有获得了子节点 IP地址才能和该子节点直接建立连接获取子节点上的用户

19、存储情况文件,该文件的文件名就是用户的用户名,通过这一个文件可以知道数据的具体存储情况,从而由客户端直接与数据块存储节点建立连接。node.dat 文件保存了云计算系统的所有子节点的 IP 地址、总空间和可用空间等信息,由 nodeInfo 数据结构来描述。管理节点各函数调用关系如图 8.4 所示。图 8.4 管理节点函数调用结构8.2.1管理节点服务器程序主函数管理节点主程序为整个管理程序的主入口,通过 4 个线程函数来监听并完成客户端所提交的任务。程序 8.1/*文件名 mainsever.cpp*/ 定义管理节点服务器程序的入口点void test();int _tmain(int ar

20、gc, _TCHAR* argv)openfile(); /获得 root.dat、node.dat 的文件指针test(); /该函数完成对主服务器的配置工作WSADATA wsa;int ret = 0;int PORT = 5100;SOCKET s_socket;SOCKET c_socket;struct sockaddr_in s_sockaddr;struct sockaddr_in c_sockaddr;int c_sockaddr_len = sizeof(c_sockaddr);ret = WSAStartup(MAKEWORD(2, 2), if(ret != 0)cou

21、t user, “0“);strcpy(user-ip,“0.0.0.0“);user-port = 0;cout user ip port port = node-port;strcpy(naddr-ip, node-ip);send(*tsock, (char *)naddr, sizeof(nodeaddr), 0); /该数据块的存储位置发送回客户端closesocket(*tsock);free(node);free(naddr);free(tsock);return 1;函数 getnodeaddrthread()接收来自客户端的数据块个数,并为每个数据块分配一个存储节点,数据块的

22、分配通过调用 datagetnode()函数来完成,该函数按剩余空间最大的策略向各数据块分配存储节点,并将分配结果发送回客户端,由客户端根据接收到的子节点 IP 直接连接子节点来完成文件的存储工作,并将存储结果写入子节点中的数据分块描述文件中,以便系统在下次读取时获得数据的存储情况。8.2.3主服务器中其他函数的设计主服务器其他函数定义。程序 8.6/*文件名 mfile.cpp*/*向 node.dat 文件添加节点信息*/int nodeadd(char* ip, int port, _off_t totalsize)nodeInfo *temp = (nodeInfo *) malloc

23、 (sizeof(nodeInfo);fseek(fp_node, 0, 0);/*判断该节点是否已存在*/while( fread(temp, sizeof(nodeInfo), 1, fp_node) = 1)if(strcmp(temp-ip, ip) = 0 return 0;strcpy(temp-ip, ip);temp-port = port;temp-userNum = 0;temp-totalsize = totalsize;temp-freesize = totalsize;/*写入 node.dat 文件*/fwrite(temp, sizeof(nodeInfo), 1

24、, fp_node);fseek(fp_node, 0, 0);fflush(fp_node);free(temp);return 1;/*分配用户数据描述文件存储节点的 IP*/int usergetnode(nodeInfo *node)nodeInfo *temp = (nodeInfo *) malloc (sizeof(nodeInfo);fseek(fp_node, 0, 0);int num = 0;int no = 0;/*寻找已分配 uesername 文件最少的节点 IP*/if(fread(node, sizeof(nodeInfo), 1, fp_node) != 1)

25、return 0;while( fread(temp, sizeof(nodeInfo), 1, fp_node) = 1)+num;if(temp-userNum userNum)*node = *temp;no = num;memset(temp, 0, sizeof(nodeInfo);*temp = *node;temp-userNum += 1;fseek(fp_node, no*sizeof(nodeInfo), 0);fwrite(temp, sizeof(nodeInfo), 1, fp_node);fseek(fp_node, 0, 0);fflush(fp_node);fr

26、ee(temp);return 1;/*将 username 及对应存储数据描述文件的节点 IP 写入 root.dat 文件*/int useradd(char* username)userInfo *temp = (userInfo *) malloc (sizeof(userInfo);nodeInfo *node = (nodeInfo *) malloc (sizeof(nodeInfo);fseek(fp_user, 0, 0);while( fread(temp, sizeof(userInfo), 1, fp_user) = 1)/*检测该用户名是否存在*/if(strcmp(

27、temp-user, username) = 0)free(temp);free(node);return 0; /该用户名已经存在if(usergetnode(node) = 0)/获取该用户数据描述文件存储节点的 IP,通过 node 参数传出return -1; /获取节点失败memset(temp, 0, sizeof(userInfo);strcpy(temp-user, username);strcpy(temp-ip, node-ip);temp-port = node-port;/*将 userInfo 信息写入 root.dat 文件,确认数据块描述文件的存储位置*/fwri

28、te(temp, sizeof(userInfo), 1, fp_user) ;fseek(fp_user, 0, 0);fflush(fp_user);free(temp);free(node);return 1;/*根据用户名,读取 root.dat 文件中的 userInfo 数据*/int userget(char* username, userInfo *user)userInfo *temp = (userInfo *) malloc (sizeof(userInfo);fseek(fp_user, 0, 0);while( fread(temp, sizeof(userInfo)

29、, 1, fp_user) = 1)if(strcmp(temp-user, username) = 0)*user = *temp;return 1;return 0;/*根据 node.dat 文件获取系统中的节点信息 nodeInfo,并按最大剩余空间优先策略分配给数据块*/*分配完成后更新 node.dat 文件的内容*/int datagetnode(nodeInfo *node)nodeInfo *temp = (nodeInfo *) malloc (sizeof(nodeInfo);fseek(fp_node, 0, 0);int num = 0;int no = 0;if(f

30、read(node, sizeof(nodeInfo), 1, fp_node) != 1)return 0;/*首先向剩余空间最大的节点分配数据块*/while( fread(temp, sizeof(nodeInfo), 1, fp_node) = 1)+num;if(temp-freesize node-freesize)*node = *temp;no = num;memset(temp, 0, sizeof(nodeInfo);*temp = *node;temp-freesize -= BLOCKSIZE;fseek(fp_node, no*sizeof(nodeInfo), 0)

31、;/*将分配后的信息写回 node.dat 文件,更新文件信息*/fwrite(temp, sizeof(nodeInfo), 1, fp_node);fseek(fp_node, 0, 0);fflush(fp_node);free(temp);return 1;/*获得 rood.dat 和 node.dat 的文件指针*/*fp_user 指向 root.dat 文件*/*fp_node 指向 node.dat 文件*/void openfile()if( (fp_user = fopen(“root.dat“, “rb+“) = NULL)fp_user = fopen(“root.d

32、at“, “wb+“);if( (fp_node = fopen(“node.dat“, “rb+“) = NULL)fp_node = fopen(“node.dat“, “wb+“);8.3子节点程序分析云计算 V0.01 中子节点主要完成数据的存储及用户文件存储信息的保存,各用户文件存储信息的文件名为该用户的用户名,子节点程序需要在所有的节点上同时运行。文件的存储和访问由客户端与子节点直接连接来完成,子节点和管理节点不进行任何的数据通信工作。各数据块存储的文件名为 username_filename_blockNo,即用户名加文件名加数据块号,之间用下划线连接。子节点函数调用结构如图 8

33、.5 所示。图 8.5 子节点函数调用结构8.3.1子节点主函数子节点的主程序启动后监听来自于客户端发过来的命令 cmd,根据不同的命令进入不同的线程进行处理。程序 8.7/*文件名 blocksever.cpp*/ blocksever.cpp : 定义控制台应用程序的入口点int _tmain(int argc, _TCHAR* argv)WSADATA wsa;int ret = 0;int PORT = 5101;SOCKET s_socket;SOCKET c_socket;struct sockaddr_in s_sockaddr;struct sockaddr_in c_sock

34、addr;int c_sockaddr_len = sizeof(c_sockaddr);ret = WSAStartup(MAKEWORD(2, 2), if(ret != 0)cout 0)char *buf = (char *) malloc (filelen);fread(buf, 1, filelen, fp);send(*tsock, buf, filelen, 0);free(buf);closesocket(*tsock);fclose(fp);return 1;用户从管理节点获取到数据块描述文件所在的节点 IP 地址后,即可连接该节点并调用此函数获取文件内容,由于该文件的文件

35、名就是用户名,所以子节点只要知道了用户名即可知道需要打开的文件名,该节点通过 socket 接收用户名就是这个原因。2添加数据块描述信息线程函数程序 8.10/*文件名 bthread.cpp*/unsigned _stdcall fileinfoaddthread(LPVOID p)/添加文件信息线程SOCKET* tsock = (SOCKET *)p;int listlen = 0;char filenameFILENAME_LEN;char usernameUSERNAME_LEN;fileInfo ftmp;/定义文件信息数据结构blockInfo btmp;fileInfoList

36、 L;initlist(recv(*tsock, username, USERNAME_LEN, 0); /获取用户名recv(*tsock, filename, FILENAME_LEN, 0); /获取文件名recv(*tsock, (char *) i e0.filename);if(filesearch(filename, fp) = 0) /检测是否有同名文件filedel(filename,fp); /如有同名文件则删除并覆盖该文件fseek(fp, 0, SEEK_END);for(int i = 0; i length; i+)file = L-ei;fwrite(return

37、 1;/*在 username 文件中检测是否有同名文件*/int filesearch(char* filename, FILE *fp)fileInfo ftmp;fseek(fp, 0, 0);while( fread(return 1;/*覆盖同名文件*/int filedel(char* filename, FILE *fp)fileInfo ftmp;fseek(fp, 0, 0);while(!feof(fp)fread(if(strcmp(ftmp.filename, filename) = 0)strcpy(ftmp.filename, “0“);fseek(fp, ftel

38、l(fp)-sizeof(fileInfo),0);fwrite(fseek(fp,ftell(fp), 0);return 1;在文件存储信息的添加过程中我们采用顺序表来维护各数据块的存储信息,因此定义了几个基本的顺序表操作。程序 8.12/*位于文件 blist.cpp*/*初始化顺序表函数*/int initlist(fileInfoList *L)L-e = (fileInfo *) malloc (LISTLEN * sizeof(fileInfo);if(L-e = NULL)printf(“初始化表,分配内存失败“);return 0;L-length = 0;L-size =

39、LISTLEN;return 1;/*向顺序表中加入一个数据块存储信息*/int addlist(fileInfoList *L, fileInfo e)if(L-length = L-size)fileInfo *newbase = (fileInfo *) realloc (L-e, (L-size + LISTLEN)*sizeof(fileInfo);if(newbase = NULL)printf(“向表添加数据,增加内存空间失败“);return 0;L-e = newbase;L-size += LISTLEN;L-eL-length = e;+ L-length;return

40、0;/*释放存储空间*/int destroylist(fileInfoList *L)L-length = 0;L-size = 0;free(L-e);return 0;3保存数据块线程函数程序 8.13/*文件名 bthread.cpp*/unsigned _stdcall storedatathread(LPVOID p)/保存数据块SOCKET* tsock = (SOCKET *)p;int datalen = -1;int blockNo = -1;char filenameFILENAME_LEN;char usernameUSERNAME_LEN;recv(*tsock,us

41、ername, USERNAME_LEN, 0);recv(*tsock, filename, FILENAME_LEN, 0);recv(*tsock, (char *)recv(*tsock,(char *)char *buf = (char *) malloc (datalen);recv(*tsock,buf, datalen, 0);cout = 0*num += j;return 1;我们的计算数据是按字符串存储,函数 getresult()对本节点数据块实施求和操作,我们同样也定义其他的数据处理函数,如类似 wordcount 函数等,通过这一函数我们实现对数据的本地化处理,每个

42、 getresult()函数只处理本节点所存储数据块的数据。这一函数演示了计算向存储的迁移过程。8.4客户端 API设计云计算 V0.01 为客户端提供了可以访问的 API 函数,从负载上我们给客户端增加了一些负载,将文件的分块等工作交给了客户端来完成,只是将计算工作交给子节点来完成。客户端的主要工作模式是从管理节点读取系统信息,根据这一信息与各子节点直接进行联系完成文件操作及计算任务。下面是系统提供的主要 API 函数,分别在 capi.cpp 和 cfun.cpp 中定义。int cwrite(userInfo user, char* filename, FILE *fp, FILE *f

43、p_tmp); /将数据写入节点int getdata(char* username, char* filename, FILE *fp_tmp);int creatconnect(char* ip, int port, SOCKET *csock); /链接服务器,成功返回 1,失败返回 0int userregister(char* username); /用户注册int userlogin(char* username, userInfo *user, FILE *fp); /用户登录int getuserfile(userInfo user, FILE *fp); /从节点获取用户信息

44、文件int getuseraddr(userInfo *user); /从主节点获取用户信息文件存放地址int getnode(nodeaddrList *L, int num); /从主节点分配节点地址int userinfoadd(fileInfoList *L, userInfo user, FILE *fp_tmp);/用户信息文件中添加一个文件信息8.4.1客户端文件的存储客户端文件的存储是通过调用 API 函数 cwrite()来实现的,它在实际调用时采用如下的形式:cwrite(user, “data.txt“, fp, fp_t);函数参数中 user 为文件所属用户的用户名,

45、data.txt 为需要存储的数据文件,fp 为该文件的指针,fp_t 是临时文件的指针。F 数据结构存储有本次文件分割后所有数据块的存储信息,即username文件中的信息。函数 cwrite()同时把该信息写入子节点和本地的临时文件中。API 函数 cwrite()的定义如下。程序 8.16/*保存在文件 capi.cpp 中*/*实现文件分布式存储功能的 API*/int cwrite(userInfo user, char* filename, FILE *fp, FILE *fp_tmp)cout 9)break;if(d.bufi-1 9)break;else-i;-d.datal

46、en;fseek(fp, -1L, 1);adddatalist(L, d);return 1;文件的分割完成后 cwrite()函数调用 storedatathread()函数启动向各子节点的写入操作,完成数据的分块存储。storedatathread()函数的定义如下。程序 8.19/*文件存放位置 cthread.cpp*/unsigned _stdcall storedatathread(LPVOID p)threadelem *t = (threadelem *)p;WSADATA wsa;SOCKET csock;int ret = 0;ret = WSAStartup(MAKEWORD(2, 2), if(ret != 0)cout ip, t-port, closesocket(csock);WSACleanup();return 0;cmd = STOREBLOCK;

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报