CS架构下实现简单的文件传输功能

xiaoxiao2021-02-28  128

实现代码保存在github中: https://github.com/distanceNing/first 客户端主要实现代码如下: #include #include "Csocket.h" const int PORT=9000; #include "send_file.h" #include "check_permission.h" int main(int argc, char* argv[]) { if (argc < 4) { std::cerr << "argc < 4 !\n "; return -1; } //命令行参数第二个为目标服务器IP 第三个为本地文件 第四个为服务器上的文件目录以及复制后的文件名 const char* local_file_name=argv[2]; //检查本地文件是否存在以及用户对本地文件是否有权限 int flag=check_permission(local_file_name); if(flag==no_file) { std::cerr<<"No this file !\n"; return -1; } if(flag==permission_denied) { std::cerr<<"Local file permission denied!\n"; return -1; } Csocket sock; sock.CreatSocket(); char* fromIP = argv[1]; UINT fromPort=PORT; //defaut port is 9000 //连接服务器 if (!sock.Connect(fromIP, fromPort)) { std::cout << "connect fail !\n"; return -1; } char* file_name = argv[3]; //向服务器发送文件目录以及复制后的文件名 sock.Send(file_name, strlen(file_name)); int ret; //等待服务器的回复 sock.Receive(&ret, sizeof(ret)); //服务器上无此目录 if (ret == no_file) { std::cout << "No this directory!\n"; return -1; } //开启服务的用户权限不允许 if (ret==permission_denied) { std::cout << "Permission denied!\n"; return -1; } //所有检查工作完成后向服务器传输数据 int size = send_file(local_file_name, sock); sock.CloseSocket(); std::cout<<"copy successful!\n"; return 0; } 服务器端的思路:先监听9000端口,等待连接,待客户端连接后,检查文件权限,检查完后传输文件。 客户端的实现思路基本相同,代码在此处就补贴出来了,有兴趣的朋友可以去我的github中看。 传输文件:先把文件内容读入缓冲区,再向服务端发送。 int send_file(const char * const filename,Csocket &sock) { #判断文件格式,并向服务端发送 int ret=is_text_file(filename); sock.Send(&ret,sizeof(ret)); int send_size = 0; int size; //打开文件 int fd=open(filename,O_RDONLY); assert(fd>0); //取文件信息 struct stat stat_buf; fstat(fd,&stat_buf); //用sendfile函数直接将fd中的内容读出,并写入套接字中 send_size=sendfile(sock.GetSocket(),fd,NULL,stat_buf.st_size); return send_size; } 其他的具体实现代码网址在博文开头。 由于博客上传文件太麻烦,测试例子请移步我的有道云笔记: http://note.youdao.com/noteshare?id=6aec8b236de787c2dbffd7634b26c579&sub=3A84F6FC0D2448B6BCAE4D768C5D0BA8
转载请注明原文地址: https://www.6miu.com/read-43932.html

最新回复(0)