修改ndn-file支持多服务器下载上传
修改ndn-file支持多服务器下载上传
Node1机器作为文件客户端,Node2,Node3,Node4作为文件服务端,修改Node1程序使其能够支持多个服务端下载上传。
首先修改main函数,读取config文件的参数存入vector中。
1 | std::vector <std::string> vec; |
config文件的格式为:
1 | /Node1/file /Node2/file |
接着就要修改MainWindow的构造函数,改变其传参从string
到vector<string>
1 | MainWindow::MainWindow(const std::string &producerPrefix, const std::vector<std::string> &serverPrefix, QWidget *parent) : QMainWindow(parent), |
修改了对m_client
的传参,因此还需要修改m_client
的构造及成员变量m_prefix
的类型
这时m_client
就有一组prefix
,可以用于请求服务端数据了。
接着修改requestFileList
函数,循环请求Node2,Node3,Node4节点的文件列表。
1 | void Client::requestFileList() |
Node2,Node3,Node4返回数据包会触发onFileListData
回调函数。
修改onFileListData
回调函数中对数据包的处理,这步很重要。因为返回的(char *)data->value
格式都为<FileList>
开头,</FileList>
结尾。如果之间将(char *)data->value
传至displayFileListInfor
函数中会导致后面收到的把前面的覆盖。结果就是只显示Node4的文件列表。
现在将所有的<FileList>
开头,</FileList>
结尾都去掉,然后用新变量disp_str
来存储,最后一次收到的(char *)data->value
加入到disp_str
后交给displayFileListInfor
函数,会将之间的都覆盖,达到了显示所有服务器的文件列表的效果。
1 | static void onFileListData(const struct data_t *data, void *param) |
然后就是在下载文件和同步的过程中需要判断文件属于哪个服务器,就想对应的服务器发送兴趣包请求。在这里直接用文件名进行了简单的判断,后面有优化的空间。
1 | void Client::batchSendInterest() |
最终程序能够实现的效果是:Node1能够请求Node2,Node3,Node4的文件列表,显示在QT界面中,能够下载各个节点上的文件。也可以上传文件到所有的服务器节点。