作业
客户端不在线情况,客户端未注册的情况
思路
客户端不在线
将文件暂存在本地; 复制客户端接收文件 的代码
等待客户端上线后,立刻发送给该客户端; 复制客户端发送文件 的代码
客户端未注册 仅收包,不转发,不处理
代码
用户不在线 数据存放在服务器文件夹
typedef struct User{
char name[20];
char pswd[20];
int sock;
int hasMsg;
char msg[1024];
int hasFileMsg; // 用于表示是否有文件未读
char need_read_filemame[5][128]; //存储需要读取的文件名,最多五个离线文件
}user_t;
if(res == -1){
// 目标用户 没注册 仅收包,不做任何处理
}else{
if(user_arr[res].sock == 0){
//文件转存到 服务器,等上线再发给客户端
/* 复制客户端接收文件的代码 */
char filename[128] = "./client_file_temp/";
// 获取文件名,方便打开文件
strcat(filename , pack.filename);
// 将需要待收文件 告知该客户端
int len=user_arr[res].hasFileMsg;
user_arr[res].hasFileMsg++;
//文件名存放
strcpy(*(user_arr[res].need_read_filemame+len),pack.filename);
printf("文件暂存在服务器目录:%s\n",*(user_arr[res].need_read_filemame+len));
int fd = open(filename,O_CREAT | O_TRUNC | O_WRONLY,0666);
// 获取文件长度
long filesize = pack.filesize;
long readed_size = 0;
//printf("接收到文件名和文件大小\n");
while(1){
pack_t filepack = {0};
int res = read(client,&filepack,sizeof(filepack));
if(res != sizeof(filepack)){
printf("发生分包\n");
}
int size = strlen(filepack.text);
//printf("接受到文件信息\n");
write(fd,filepack.text,size);// 将接受到的文件内容,写入文件中去
readed_size += size;
if(readed_size >= filesize){
close(fd);
break;
}
}
printf("服务器提示:文件暂存服务器 完成 请检查效果\n");
}else{
// 目标用户在线,直接将接收到的pack包转发给目标用户
write(user_arr[res].sock,&pack,sizeof(pack));
}
用户上线后 文件立即发送给用户
printf("用户有未读文件个数:%d\n",user_arr[res].hasFileMsg);
while(user_arr[res].hasFileMsg)
{
int need_read_num=user_arr[res].hasFileMsg-1;
/* 客户端代发文件 */
/* 复制客户端发送文件的代码 */
pack_t pack = {0};
pack.type = TYPE_FILE_UPLOAD_REQUEST;
//发送对象
strcpy(pack.tarname,user_arr[res].name);
//发送文件名
strcpy(pack.filename,*(user_arr[res].need_read_filemame+need_read_num));
char filename[128] = "./client_file_temp/";
strcat(filename,*(user_arr[res].need_read_filemame+need_read_num));
int fd = open(filename,O_RDONLY);
if(fd == -1){
printf("该文件不存在 :不应该不存在,打不开请检查文件名\n");
break;
}
struct stat buf = {0};
stat(filename,&buf);
pack.filesize = buf.st_size;
write(client,&pack,sizeof(pack));
printf("\n用户有未读文件 开始读取\n");
while(1){
pack_t pack = {0};
pack.type = TYPE_FILE_UPLOAD_REQUEST;
//发送对象
strcpy(pack.tarname,user_arr[res].name);
//发送文件名
strcpy(pack.filename,*(user_arr[res].need_read_filemame+need_read_num));
printf("pack.fileanme=%s\n",pack.filename);
int res = read(fd,pack.text,1023);
if(res == 0){break;}
write(client,&pack,sizeof(pack));
}
close(fd);
user_arr[res].hasFileMsg--;
printf("服务器提示:本次代发完成 请在客户端检查\n");
效果
用户在线 效果图
用户不在线,后续上线时,效果图