⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 linuxdown.c

📁 linux下的ftp客户端
💻 C
📖 第 1 页 / 共 2 页
字号:
				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 + -