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

📄 misc.c

📁 linux下多线程的下载软件源码
💻 C
字号:
#include <stdio.h>#include <stdarg.h>#include <stdlib.h>#include <unistd.h>#include <string.h>#include <strings.h>#include <errno.h>#include <sys/stat.h>#include <sys/types.h>#include "Misc.h"#include "Data.h"void parse_url(char *url, struct request *req){	char *s;	int i, j, k;	i = j = k = 0;	s = url;	if ((strncmp(url, "ftp://", 6)) == 0) {		fprintf(stderr, "Error: Currently Aget doesn't support FTP requests...\n");		exit(1);	} else	if ((strncmp(url, "http://", 7)) != 0) {		fprintf(stderr, "Error: URL should be of the form http://...\n");		exit(1);	}	if (req->port == 0) {		req->port = 80;		req->proto = PROTO_HTTP;	}	s = url + 7; 	/* Jump pass http:// part	*/	for (i = 0; *s != '/'; i++, s++) {		if (i > MAXHOSTSIZ) {			fprintf(stderr, "Error: Cannot get hostname from URL...\n");			exit(1);		}		if (*s == ':') {	/* If user/pass is supplied like; http://murat:12345@x.y.com/url.html */			while(*s != '/') {				req->username[j++] = *--s;				i--;			}			req->username[--j] = '\0';			revstr(req->username);			while(1) {				if (*s == ':') {					while(*s != '@') {						if (k > MAXBUFSIZ) {							fprintf(stderr, "Error: Cannot get password from URL...\n");							exit(1);						}						req->password[k++] = *++s;					}					break;				}				s++;			}			req->password[--k] = '\0';		}		req->host[i] = *s;	}	req->host[i] = '\0';	for (i = 0; *s != '\0'; i++, s++) {		if (i > MAXURLSIZ) {			fprintf(stderr, "Error: Cannot get remote file name from URL...\n");			exit(1);		}		req->url[i] = *s;	}	req->url[i] = '\0';	--s;	for (i = 0; *s != '/'; i++, s--) {		if (i > MAXBUFSIZ) {			fprintf(stderr, "Error: Cannot get local file name from URL...\n");			exit(1);		}		req->file[i] = *s;	}	req->file[i] = '\0';	revstr(req->file);}int numofthreads(int size){	if (size == 0)		return 0;	else if (size < BUFSIZ * 2) 				/* < 16384 */			return 1;	else if ((size >= BUFSIZ * 2) && (size < BUFSIZ * 4))	/* 16384 < x < 32678	*/ 		return 2;	else if ((size >= BUFSIZ * 4) && (size < BUFSIZ * 8))	/* 32768 < x < 65536	*/		return 3;	else if ((size >= BUFSIZ * 8) && (size < BUFSIZ * 16))	/* 65536 < x < 131072	*/		return 4;	else if ((size >= BUFSIZ * 16) && (size < BUFSIZ * 32))	/* 131072 < x < 262144	*/		return 5;	else if ((size >= BUFSIZ * 32) && (size < BUFSIZ * 64))			return 6;	else if ((size >= BUFSIZ * 64) && (size < BUFSIZ * 128))			return 7;	else if ((size >= BUFSIZ * 128) && (size < BUFSIZ * 256))			return 8;	else if ((size >= BUFSIZ * 256) && (size < BUFSIZ * 512))			return 9;	else 		return 10;}int calc_offset(int total, int part, int nthreads){	return (part * (total / nthreads));}void usage(){	fprintf(stderr, "usage: aget [options] url\n");	fprintf(stderr, "\toptions:\n");	fprintf(stderr, "\t\t-p port number\n");	fprintf(stderr, "\t\t-l local file name\n");	fprintf(stderr, "\t\t-n suggested number of threads\n");	fprintf(stderr, "\t\t-f force using suggested number of threads\n");	fprintf(stderr, "\t\t-h this screen\n");	fprintf(stderr, "\t\t-v version info\n");	fprintf(stderr, "\n");	fprintf(stderr, "http//www.enderunix.org/aget/\n");}/* reverse a given string	*/void revstr(char *str){	char *p, *s;	int i;	int size;	if ((size = strlen(str)) == 0)		return;	p = (char *)calloc(size, sizeof(char));	s = p;	for (i = size; i >= 0; i--, s++)		*s = *(str + i - 1);	*s = '\0';	memset(str, 0, size);	strncpy(str, p, size);	free(p);}/* Log	*/void Log(char *fmt, ...){	va_list ap;	char *lfmt;	lfmt = (char *)calloc(7 + strlen(fmt), sizeof(char));	sprintf(lfmt, "<LOG> %s", fmt);	fflush(stdout);	va_start(ap, fmt);	vfprintf(stderr, lfmt, ap);	va_end(ap);	if (fmt[0] != '\0' && fmt[strlen(fmt) - 1] == ':')		fprintf(stderr, " %s", strerror(errno));	fprintf(stderr, "\n");	free(lfmt);}/* Progress Bar	*/void updateProgressBar(float cur, float tot){	float rat;	int ndot, i;	static float prev = -1;	rat = cur/tot;	ndot = (int)(rat * 100);	if ((ndot < prev + 5) && (ndot != 100))		return;	for (i = 0; i < ndot; i += 2)		putchar('.');	for (i = ndot - 1; i < 100; i += 2)		putchar(' ');	printf("[%d%% completed]\n", ndot);		prev = ndot;}void handleHttpRetcode(char *rbuf){	if ((strstr(rbuf, "HTTP/1.1 416")) != NULL) {		Log("Server returned HTTP/1.1 416 - Requested Range Not Satisfiable\n");	        exit(1);	} else	if ((strstr(rbuf, "HTTP/1.1 403")) != NULL) {		Log("<Server returned HTTP/1.1 403 - Permission Denied\n");		exit(1);	} else	if ((strstr(rbuf, "HTTP/1.1 404")) != NULL) {		Log("<Server returned HTTP/1.1 404 - File Not Found\n");		exit(1);	} }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -