实现代码保存在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