【无标题】

作业

客户端不在线情况,客户端未注册的情况

思路

客户端不在线

        将文件暂存在本地;                                            复制客户端接收文件 的代码

        等待客户端上线后,立刻发送给该客户端;        复制客户端发送文件 的代码

客户端未注册        仅收包,不转发,不处理

代码

用户不在线        数据存放在服务器文件夹

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");    

效果

用户在线 效果图

用户不在线,后续上线时,效果图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值