📄 linuxdown.c
字号:
bytesget=recv(sock,buf,bytesleft,0); if(bytesget==0)boolbyte++; if(bytesget<0||(bytesget==0&&boolbyte>=10)){ s_info->a1+=offset; printf("\n!!!!!thread %d try again at less than 1024 %d!!!!\n",s_info->threadnumber,offset); close(sock); pthread_mutex_lock(&lock); s_info->booldown=0; s_info->allowotherdown=0; pthread_mutex_unlock(&lock); DownLoadHttp(s_info); return 0; } write(s_info->fd,buf,bytesget); offset+=bytesget; sizeget+=bytesget; bytesleft-=bytesget; if(bytesleft<=1024){ nextthread++; if(g[s_info->threadnumber+nextthread].booldown==0&&g[s_info->threadnumber+nextthread].allowotherdown==1){ pthread_mutex_lock(&lock); g[s_info->threadnumber+nextthread].booldown=1; pthread_mutex_unlock(&lock); bytesleft+=g[s_info->threadnumber+nextthread].a2-g[s_info->threadnumber+nextthread].a1+1; s_info->a2=g[s_info->threadnumber+nextthread].a2; } } } ClearBuf(buf); } if(boolprint==0){ printf("%f ",(float)sizeget/(float)filelength); gettimeofday(&tpend,NULL); timeuse=1000000*(tpend.tv_sec-tpstart.tv_sec)+tpend.tv_usec-tpstart.tv_usec; timeuse/=1000000; printf("Per download rate is %fk/s bytesget is %d\n",(float)sizeget/1000/(float)timeuse,sizeget); } } printf("****************%d bytes get is %d****************\n",s_info->threadnumber,offset); close(sock); return 0; } else return -1;}int DownLoadFtp(struct arg *s_info){ char get[256],dataget[2048]; char buf[2048]; char port1[8],port2[8];//227 Entering Passive Mode (192,168,8,30,6,32) 6 is stored in port1, while 32 is stored in port2 char headhost[256]; char range[32]; float f; long timeuse;#define FALSE 0#define TRUE 1 //this function used to download assigned file from a1 bytes to a2 bytes from host, try 5 times int connected =FALSE,bytesget;//bytesget stans for how many bytes get one time int i,j,starttext,boolprint=0; int sock,sockdata;//sockdata is used to download ftp data through another sock because ftp use 2 pipes int readen,portthread=0,nextthread=0; int inflen,index=0,offset=0; int bytesleft=(s_info->a2)-(s_info->a1)+1; struct timeval tv; if(s_info->threadnumber!=0){ while(g[(s_info->threadnumber)-1].booldown==0){ sleep(1); } } if(s_info->booldown==1&&s_info->allowotherdown==1)return 0; while(1){ if((sock=ConnectHttp(host,portftp))<=0)sleep(1); else{ connected=TRUE; break; } } if(connected){ recv(sock,dataget,512,0); write(1,dataget,strlen(dataget)); ClearBuf(dataget); sprintf(headhost,"USER %s\r\n\r\n",user);; if(send(sock,headhost,strlen(headhost),0)!=strlen(headhost)){ printf("Error in sending HEAD\n"); close(sock); sleep(5); DownLoadFtp(s_info); return 0; } recv(sock,dataget,512,0); write(1,dataget,strlen(dataget)); ClearBuf(dataget); sprintf(headhost,"PASS %s\r\n\r\n",pass); if(send(sock,headhost,strlen(headhost),0)!=strlen(headhost)){ printf("Error in sending HEAD\n"); close(sock); sleep(5); DownLoadFtp(s_info); return 0; } recv(sock,dataget,512,0); write(1,dataget,strlen(dataget)); if(strstr(dataget,"421 No more connection")!=NULL){ close(sock); sleep(5); DownLoadFtp(s_info); return 0; } ClearBuf(dataget); sprintf(headhost,"TYPE I\r\n\r\n"); if(send(sock,headhost,strlen(headhost),0)!=strlen(headhost)){ printf("Error in sending HEAD\n"); close(sock); sleep(5); DownLoadFtp(s_info); return 0; } recv(sock,dataget,512,0); ClearBuf(dataget); sprintf(headhost,"PASV\r\n\r\n"); if(send(sock,headhost,strlen(headhost),0)!=strlen(headhost)){ printf("Error in sending HEAD\n"); DownLoadFtp(s_info); return 0; } recv(sock,dataget,512,0); write(1,dataget,strlen(dataget)); if(strstr(dataget,"227 Entering Passive Mode")!=NULL){ j=4; i=0; while(j>=1){ if(*(strstr(dataget,"227 Entering Passive Mode")+i)==',')j--; i++; } j=i+1; while(1){ if(*(strstr(dataget,"227 Entering Passive Mode")+j)==',')break; j++; } snprintf(port1,j-i+1,"%s",strstr(dataget,"227 Entering Passive Mode")+i); i=j+1; while(1){ if(*(strstr(dataget,"227 Entering Passive Mode")+i)==')')break; i++; } snprintf(port2,i-j,"%s",strstr(dataget,"227 Entering Passive Mode")+j+1); portthread=256*atoi(port1)+atoi(port2); } ClearBuf(dataget); sprintf(headhost,"REST %d\r\n\r\n",s_info->a1); if(send(sock,headhost,strlen(headhost),0)!=strlen(headhost)){ printf("Error in sending HEAD\n"); close(sock); sleep(5); DownLoadFtp(s_info); return 0; } recv(sock,dataget,512,0); if(strstr(dataget,"227 Entering Passive Mode")!=NULL){ j=4; i=0; while(j>=1){ if(*(strstr(dataget,"227 Entering Passive Mode")+i)==',')j--; i++; } j=i+1; while(1){ if(*(strstr(dataget,"227 Entering Passive Mode")+j)==',')break; j++; } snprintf(port1,j-i+1,"%s",strstr(dataget,"227 Entering Passive Mode")+i); i=j+1; while(1){ if(*(strstr(dataget,"227 Entering Passive Mode")+i)==')')break; i++; } snprintf(port2,i-j,"%s",strstr(dataget,"227 Entering Passive Mode")+j+1); portthread=256*atoi(port1)+atoi(port2); printf("\n^^^^^^^^^^^^%d^^^^^^^^^^^\n",portthread); } write(1,dataget,strlen(dataget)); ClearBuf(dataget); if(portthread==0){ close(sock); sleep(5); DownLoadFtp(s_info); return 0; } sprintf(get,"RETR %s\r\n\r\n",path); if(send(sock,get,strlen(get),0)!=strlen(get)){ printf("Error in sending get\n"); close(sock); sleep(5); DownLoadFtp(s_info); return 0; } write(1,host,strlen(host)); s_info->fd=open(filename,O_WRONLY|O_CREAT,0644); lseek(s_info->fd,s_info->a1,0); connected=FALSE; for(i=0;i<=5;i++){ if((sockdata=ConnectHttp(host,portthread))<=0) sleep(1); else{ connected=TRUE; break; } } if(connected=FALSE){ sleep(5); DownLoadFtp(s_info); return 0; } ClearBuf(buf); boolprint=0; if(s_info->booldown==1&&s_info->allowotherdown==1)return 0; pthread_mutex_lock(&lock); s_info->booldown=1; pthread_mutex_unlock(&lock); while(bytesleft>0){ readen =ReadEn(sockdata,30); if(readen<1){ s_info->a1+=offset; printf("fails to open sockdata,thread %d restart at offset %d\n",s_info->threadnumber,offset); close(sockdata); sleep(2); pthread_mutex_lock(&lock); s_info->booldown=0; s_info->allowotherdown=0; pthread_mutex_unlock(&lock); DownLoadFtp(s_info); return 0; } boolprint++; if(boolprint==10)boolprint=0; if(bytesleft>=1024){ bytesget=recv(sockdata,buf,1024,MSG_DONTWAIT); if(bytesget<0){ s_info->a1+=offset; printf("\n!!!!!buf size is %d thread %d try again at %d!!!!\n",strlen(buf),s_info->threadnumber,offset); close(sockdata); pthread_mutex_lock(&lock); s_info->booldown=0; s_info->allowotherdown=0; pthread_mutex_unlock(&lock); DownLoadFtp(s_info); return 0; } write(s_info->fd,buf,bytesget); bytesleft-=bytesget; offset+=bytesget; sizeget+=bytesget; } else{ bytesget=recv(sockdata,buf,bytesleft,MSG_DONTWAIT); if(bytesget<0){ s_info->a1+=offset; printf("\n!!!!!thread %d try again at less than 1024 %d!!!!\n",s_info->threadnumber,offset); close(sockdata); pthread_mutex_lock(&lock); s_info->booldown=0; s_info->allowotherdown=0; pthread_mutex_unlock(&lock); DownLoadFtp(s_info); return 0; } write(s_info->fd,buf,bytesget); offset+=bytesget; sizeget+=bytesget; bytesleft-=bytesget; if(bytesleft<1024){ nextthread++; if(g[s_info->threadnumber+nextthread].booldown==0&&g[s_info->threadnumber+nextthread].allowotherdown==1){ pthread_mutex_lock(&lock); g[s_info->threadnumber+nextthread].booldown=1; pthread_mutex_unlock(&lock); bytesleft+=g[s_info->threadnumber+nextthread].a2-g[s_info->threadnumber+nextthread].a1+1; s_info->a2=g[s_info->threadnumber+nextthread].a2; } } } if(boolprint==0){ printf("%f ",(float)sizeget/(float)filelength); gettimeofday(&tpend,NULL); timeuse=1000000*(tpend.tv_sec-tpstart.tv_sec)+tpend.tv_usec-tpstart.tv_usec; timeuse/=1000000; printf("Per download rate is %fk/s\n",(float)sizeget/1000/(float)timeuse,(float)timeuse); } ClearBuf(buf); } printf("****************thread %d bytes get is %d****************\n",s_info->threadnumber,offset); close(sock); close(sockdata); return 0; } else return -1;}/*int Send(int sock,char *fmt,...){ char BUF[1024]; va_list argptr; va_start(argptr,fmt); vsprintf(BUF,fmt,argptr); va_end(argptr); printf("^^^^^BUF is %s^^^\n"); return send(sock, BUF,strlen(BUF),0);}*/int ReadEn(int sock,int n){ fd_set rfdset; struct timeval tv; tv.tv_sec=n; tv.tv_usec=0; int readen=0; FD_ZERO(&rfdset); FD_SET(sock,&rfdset); readen=select(sock+1,&rfdset,NULL,NULL,&tv); return readen;}int GetThreadSize(void){ int threadsize; int ntemp; int i; if((threadsize=(filelength/nthread))>=2048){ ntemp=threadsize/2048; threadsize=ntemp*2048; } else{ threadsize=2048;//the least size of each thread for(i=1;i<=nthread;i++){ if(i*threadsize>=filelength){ nthread=i; break; } } } return threadsize;}int GetHttpData(){ char head[256]; char headhost[256]; char dataget[512]; int threadsize=0; int i_sock,i; pthread_t thrd[30]; float timeuse; threadsize=GetThreadSize(); printf("\nthreadsize is %d, nthread is %d filelength is %d\n",threadsize,nthread,filelength); gettimeofday(&tpstart,NULL); for(i=0;i<=(nthread)-1;i++){ pthread_mutex_lock(&lock); g[i].booldown=0; pthread_mutex_unlock(&lock); g[i].threadnumber=i; g[i].a1=threadsize*i; g[i].a2=g[i].a1+threadsize-1; if(i==(nthread-1))g[i].a2=filelength-1; pthread_create(&thrd[i],NULL,(void*)DownLoadHttp,(void*)&g[i]); } for(i=0;i<=(nthread)-1;i++) pthread_join(thrd[i],NULL); gettimeofday(&tpend,NULL); timeuse=1000000*(tpend.tv_sec-tpstart.tv_sec)+tpend.tv_usec-tpstart.tv_usec; timeuse/=1000000; printf("Per download rate is %fk/s,timeuse is %d",(float)filelength/1000/(float)timeuse,(float)timeuse); return 0; }void usage(){ printf("Version 1.0 Build by KongYang, SJTU, China\n"); printf("usage: lunixdown \"PATH\" [REFERER] threadnumber \n"); printf("For example: linuxdown \"http://be_heack.com/linuxdown.c\" \"http://be_heack.com/index.html\" 10\n"); printf("PATH can be got just by right-click the link and copy link location.\n"); printf("RFERER is the site address you get your PATH from.\n"); printf("Threadnumber must be an integer less than 20 \n"); printf("You need to use quotation mark to surround PATH in order to avoid problems caused by \"&\".\n"); printf("File will be stored at \"./\" with the name got from net.\n"); }int GetFtpData(){ char head[256]; char headhost[256]; char dataget[512]; int threadsize=0; int i_sock,i; pthread_t thrd[30]; float timeuse; threadsize=GetThreadSize(); printf("\nthreadsize is %d, nthread is %d filelength is %d\n",threadsize,nthread,filelength); gettimeofday(&tpstart,NULL); for(i=0;i<=(nthread)-1;i++){ pthread_mutex_lock(&lock); g[i].booldown=0; pthread_mutex_unlock(&lock); g[i].threadnumber=i; g[i].a1=threadsize*i; g[i].a2=g[i].a1+threadsize-1; if(i==nthread-1)g[i].a2=filelength-1; pthread_create(&thrd[i],NULL,(void*)DownLoadFtp,(void*)&g[i]); } for(i=0;i<=(nthread)-1;i++) pthread_join(thrd[i],NULL); gettimeofday(&tpend,NULL); timeuse=1000000*(tpend.tv_sec-tpstart.tv_sec)+tpend.tv_usec-tpstart.tv_usec; timeuse/=1000000; printf("Per download rate is %fk/s,timeused is %f",(float)filelength/1000/(float)timeuse,(float)timeuse); return 0; }int main(int argc, char* argv[]){ char headhost[256]; char dataget[512]; int c; pthread_t thrd[3]; int ret,length; int i_sock; char chost[256],crefer[256]; int i=0;//n_down stands for how many threads user want it to use if(argc==1){ usage(); exit(0); } else if(argc==4){ nthread=atoi(argv[3]); if(nthread>20){ printf("you can only input a number between 1 and 30\n"); exit(0); } sprintf(chost,"%s\0",argv[1]); sprintf(crefer,"%s\0",argv[2]); } else if(argc==3){ nthread=atoi(argv[2]); if(nthread>20){ printf("you can only input a number between 1 and 30\n"); exit(0); } sprintf(chost,"%s\0",argv[1]); sprintf(crefer,"\0"); } else{ printf("wrong options\n"); usage(); exit(0); } for(i=0;i<=29;i++){ g[i].booldown=1; g[i].allowotherdown=1; } sprintf(user,"anonymous"); sprintf(pass,"123456"); GetInfo(chost,crefer); if(hosttype==HTTP)GetHttpData(); else if(hosttype==FTP)GetFtpData(); return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -