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

📄 host.c

📁 下载程序,多线程下载,断点续传. 目前只能下http
💻 C
字号:
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <ctype.h>#include <sys/socket.h>#include <netinet/in.h>#include <netdb.h>#include <unistd.h>#include <arpa/inet.h>#include <host.h>#include <ants.h>#include <config.h>	int find_start(char *buf, int size) {	int i;	char *p;	p = strstr(buf, "\r\n\r\n");	if(p) {		i = p - buf + 4;		if(i >= size)			i = -1;	}	else		i = -1;	return i;}		void showhost(struct hostent *host) {	char **alias;	char *addr_name;	if(!host){		printf("never find host : \n");		return;	}	if(host->h_name)		printf("Official host name : %s\n", host->h_name);	printf("Name aliases : \n");	for(alias = host->h_aliases; *alias; alias++)		printf("%s \n",*alias);	printf("IP address:\n");	for(alias = host->h_addr_list; *alias; alias++) {		addr_name = (char *)inet_ntoa(*(struct in_addr *)(*alias));		if(addr_name)			printf("%s \n",addr_name);	}}	int connect_host(char *host, unsigned short port) {	int sd;	struct sockaddr_in pin;	struct hostent *h;		if(!(h = gethostbyname(host))) {		printf("can't get host\n");		return -1;	}#ifdef DEBUG	showhost(h);#endif	if((sd = socket(PF_INET, SOCK_STREAM, 0)) == -1) {		printf("can't create socket.\n");		return -1;	}		bzero(&pin, sizeof(pin));	pin.sin_family = AF_INET;	pin.sin_addr = *((struct in_addr *)h->h_addr);	pin.sin_port = htons(port);	if(connect(sd, (struct sockaddr*)&pin, sizeof(pin)) == -1) {		printf("can't connect web.\n");		return -1;	}	return sd;}		static int parse_url(char *url, char * res, int flag) {	char *p;	char *pn;	int err = 0;		if((!url) || (!(*url)))		return -1;		switch (flag){		case FILENAME:			p = rindex(url, '/');			if(!p) {				err = -1;				break;			}				if((*(p-1) == '/') || (*(p+1) == 0))				strcpy(res, "index.html");			else				strcpy(res, ++p);			break;			case SITENAME:		case PATHNAME:			while((p = index(url, '@')))				url = ++p;			if((p = strstr(url, "http://")))				p+= 7;			else if((p = strstr(url, "ftp://")))				p+= 6;			else				p = url;				if(flag == SITENAME) {				if((pn = index(p, ':')))					goto find_site;			}			if((pn = index(p, '/'))) {				if(flag == PATHNAME) {					strcpy(res, pn);					break;				}				{find_site:				strncpy(res, p, pn-p);				res[pn-p] = 0;				}			}			else {				if(flag == PATHNAME)					return -1;				strcpy(res, p);			}			break;				case PORTNAME:			if((p = rindex(url , ':')) && (*++p) && ((*p) != '/')) {				if((pn = index(p, '/'))) {					strncpy(res, p, pn-p);					res[pn-p] = 0;				}				else					strcpy(res, p);			}			else {				if((p = strstr(url,"http://")))					strcpy(res, "80");				else if((p = strstr(url,"ftp://")))					strcpy(res, "21");				else					err = -1;			}			break;			default:			err = -1;			break;		}			return err;}			int fill_mission(struct mission *pms, char *name) {	char temp[MAX_HOSTNAME];		strcpy(pms->url, name);		if(parse_url(name, temp, PORTNAME) == -1) {		printf("bad url.\n");		return 0;	}	pms->port = atoi(temp);		if(parse_url(name, temp, SITENAME) == -1) {		printf("bad url.\n");		return 0;	}	strcpy(pms->host, temp);		if(parse_url(name, temp, PATHNAME) == -1) {		printf("bad url.\n");		return 0;	}	strcpy(pms->path, temp);		if(parse_url(name, temp, FILENAME) == -1) {		printf("bad url.\n");		return 0;	}	strcpy(pms->file, temp);		if(!(*pms->referer))		strcpy(pms->referer, pms->url);	return 1;}	

⌨️ 快捷键说明

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