上传文件块client实现

上传文件块client实现

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。


首先由内容阻止所有文件(块大小的约束),然后对于每一个chunk构造单独的一个UDP 数据报进行传输,在应用层的開始是自己定义的包头,有块号,块长度,块指纹等元数据信息,这些信息便于接收端可以按序正确接收。


/*--vonzhou
 ---this project is to upload file after chunking using 
    rabin fingerprint, here use UDP so that every packet nodelay.
    but we need to ensure the reliability.

*/

#include "global.h"

#define SERV_PORT 2500

typedef struct {
        unsigned char fp[20];
        int chunk_id;
        short flags;
        short chunk_len; // The max is 32767 enough
        char data[MAX_CHUNK_SIZE];
}TransferUnit;

// some flags for this chunk transfered.
enum{
        CHUNK_NEED_DEDU = 0x0001,   // need deduplication
        CHUNK_OTHER = 0x0002      // other for extension
};

FileInfo *fi;

int sendUDP(FileInfo *fi,int sockfd,struct sockaddr *pservaddr,socklen_t servlen){
    char buf[sizeof(TransferUnit)];
    fd_set wrset;
    struct timeval tv;
    int rlen,wlen, len = 1;
    int fd;
    int ret;
    int i,j;
    FingerChunk *p;
    TransferUnit unit;

    //connect to server
    if(connect(sockfd,(struct sockaddr *)pservaddr,servlen) == -1)
        err_quit("connet error");
    else
        printf("connect server ok!\n");

    fd = open(fi->file_path, O_RDONLY);
    if(fd==-1)
        err_quit("fopen error %s\n",strerror(errno));

    // begin to transfer the file to the server;            
    i=0;
    p = fi->first;

    while(1){
        tv.tv_sec = 1;// tell select to wait 1 second;
        tv.tv_usec = 0;

        FD_ZERO(&wrset);
        FD_SET(sockfd,&wrset);
        // wait for the socket can write        
        ret = select(sockfd+1,NULL,&wrset,NULL,&tv);
        if(ret == -1)
            err_quit("select error %s\n",strerror(errno));
        else if(ret==0){
            printf("select timeout,continue circle\n");
            continue;
        }

        //prepare for writing the socket        
        memset(&unit, 0, sizeof(unit));
        if(FD_ISSET(sockfd,&wrset)){
            /* we should first transfer some medadata,like filename,filter feature vector,
            *FIXME: file fingerprint to controller?

to make a packetin, *here just let the fp = 20 1s */ if(i == 0){ for(j=0;j<20;j++) unit.fp[j] = 0xff; unit.chunk_id = 0; //need not dedu unit.chunk_len = strlen(fi->file_path); wlen = write(sockfd, &unit, 28 + strlen(fi->file_path)); if(wlen != (28 + strlen(fi->file_path))) err_quit("write data to sockfd error:%s\n",strerror(errno)); memset(&unit, 0, sizeof(unit)); } if(p != NULL) len = p->chunklen; // the last read , p is null, so cannnot use p->chu rlen = read(fd, unit.data, len); if(rlen < 0) err_quit("fread data error %s\n",strerror(errno)); else if(rlen==0){ //indicate the transfer completed for(j=0;j<20;j++) unit.fp[j] = 0xff; unit.chunk_id = 0; //need not dedu unit.chunk_len = 3; strncpy(unit.data,"end", 3); wlen = write(sockfd,&unit,28 + 3); if(wlen !=31) err_quit("write end flag error:%s\n",strerror(errno)); printf("File %s Transfer Success!\n", fi->file_path); close(fd); return 0; } // construct this tranfer unit we cannot before read //bcos the following p pointer used. for(j=0; j< 20;j++) unit.fp[j] = p->chunk_hash[j];// 20B fingerprint; unit.chunk_id = i; // 4B chunk ID unit.chunk_len = p->chunklen; unit.flags = CHUNK_NEED_DEDU; //write to socket wlen = write(sockfd, &unit, 28+p->chunklen); if(wlen != (rlen + 28)) err_quit("write data to sockfd error:%s\n",strerror(errno)); i++; p = p->next; memset(&unit, 0, sizeof(unit)); usleep(500); printf("The %d times read\n",i); } }// end while(1)}int main(int argc ,char *argv[]){ char *fh; struct sysinfo s_info; long time1,time2; int error1,error2; int sockfd; struct stat fsize; struct sockaddr_in servaddr; error1= sysinfo(&s_info); time1 = s_info.uptime; int r; // FileInfo *fi; fi = file_new(); if(argc != 3) err_quit("useage:udpclient<IPaddress>;\n"); bzero(&servaddr,sizeof(servaddr)); servaddr.sin_family= AF_INET; servaddr.sin_port = htons(SERV_PORT); if(inet_pton(AF_INET,argv[1],&servaddr.sin_addr) <= 0) err_quit("[%s]is not a valid IPaddress\n",argv[1]); sockfd =socket(AF_INET,SOCK_DGRAM,0); r = fcntl(sockfd, F_GETFL, 0); fcntl(sockfd, F_SETFL, r & ~O_NONBLOCK); // chunking file strcpy(fi->file_path, argv[2]); chunk_file(fi); printf("File size : %lld\n",fi->file_size); printf("Chunk Num : %d\n",fi->chunknum); sendUDP(fi, sockfd, (struct sockaddr *)&servaddr,sizeof(servaddr)); close(sockfd); fprintf(stderr,"ServerIP:\t%s\n",argv[1]); if(stat(argv[2],&fsize) == -1) perror("failed to get fiel statusi\n"); else fprintf(stderr,"file name:\t%s\nfile size:\t%dK\n",argv[2],fsize.st_size/1024); error2=sysinfo(&s_info); time2 = s_info.uptime; printf("tranfice file time =%ld seconds\n",(time2-time1));}

转载请注明出处:
http://blog.csdn.net/vonzhoufz/article/details/31429585

版权声明:本文博客原创文章,博客,未经同意,不得转载。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/117349.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 黑盒测试用例设计之nextdate问题[通俗易懂]

    黑盒测试用例设计之nextdate问题[通俗易懂]首先已知有三个变量:月份,日期和年变量月份,日期和年都为整数,且都满足条件:1<=月份<=121<=日期<=311912<=年<=2012等价类划分法1.首先输入数据,划分等价类2.建立等价类表3.设计测试用例原型4.考虑隐含需求分为平年和闰年进行讨论,主要针对二月份。边界值分析法首先明晰三个定义:内点:范围内部的点上点:边界…

  • CUDA—使用GPU暴力激活成功教程密码

    CUDA—使用GPU暴力激活成功教程密码GPU支持大规模的并行加速运算,胜在量上,CPU处理大量的并行运算显得力不从心,它是胜在逻辑上。利用显卡加速的应用越来越多,但如果说GPU即将或最终将替代CPU还有点言过其实,二者最终将优势互补,各尽所能。使用显卡的无脑并行运算激活成功教程密码是一个不错的选择。这里选择一种简单的情况,限定密码是6位纯数字,并且不限定输入次数,这种情况下可以使用GPU暴力激活成功教程,当然…

  • Mac配置Maven环境[通俗易懂]

    Mac配置Maven环境[通俗易懂]1.下载maven包到本地https://maven.apache.org/download.cgi1.在应用程序找到终端(实用工具)文件夹里面2.输入命令:vi~/.bash_profile输入i进入编辑模式输入:(注意⚠️M2_HOME需要填写为自己的路径哦~)exportM2_HOME=/Library/apache-maven-3.5.3exportPATH…

  • pycharm安装cv2失败_pycharm安装cv2失败

    pycharm安装cv2失败_pycharm安装cv2失败网上找了很多教程都没成功!window764位系统python3.6pycharmctrl+alt+s找到opencv-python直接安装完全没问题。

  • Mac Quicktime 录屏带声音[通俗易懂]

    Mac Quicktime 录屏带声音[通俗易懂]最近有录屏的需求,但是Mac大多数录屏软件都收费,之前用Windows时用EV录屏,免费好用,可惜没有Mac版。Mac自带的QuickTime软件虽然能录屏,但是不能录制声音,很苦恼。直到我发现了SoundFlower软件。1、下载安装soundflower给个链接:http://mysoft.6h5.cn/Soundflower-2.0b2.dmg安…

  • 窗口动画缩放,过渡动画缩放,Animator时长缩放_关闭动画缩放好不好

    窗口动画缩放,过渡动画缩放,Animator时长缩放_关闭动画缩放好不好最近用到了ScaleAnimation来实现图片放大需求,今天就把使用过程中学习的一些东西总结记录一下,希望能对大家有所帮助。-ScaleAnimation是Android官方提供的动画类Animation的子类Animation类是一个抽象类,我们通常会使用它的四个子类AlphaAnimation、RotateAnimation、ScaleAnimation和TranslateAnimation,他们分别可以实现渐变动画、旋转动画、平移动画、缩放动画功能,当然我们今天的主角就是缩放动画Scal

    2022年10月15日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号