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

📄 htmlvery.c

📁 linux/unix下网页更新检查程序 可指定要检查的行数
💻 C
字号:
#include	<stdio.h> 
#include 	<string.h> 
#include 	<netinet/in.h> 
#include 	<sys/types.h> 
#include 	<sys/socket.h> 
#include 	<sys/signal.h> 
#include 	<sys/time.h> 
#include 	<fcntl.h> 
#include 	<unistd.h> 
#include 	<sys/ioctl.h> 

#define 	ZERO (fd_set *)	0 
#define 	BUFLEN 			256 
#ifdef 		DEBUG 
	int	tmp; 
#endif 

char 	target[]="GET http://www.sina.com/index.html\n";/*HTTP命令*/ 
char 	result[80]; 		/* 存放过滤结果的文件的名字 */ 
char 	buf[BUFLEN]; 		/* 缓冲区 */ 
FILE 	*f,*out; 			/* 输入文件和输出文件 */ 
int 		port; 			/* server的端口号 */ 
int 		status=-1; 		/* read,write,select的返回值*/ 
char 	serverName[30]; 	/* server的IP字符串 */ 
u_char 	p1,p2,p3,p4; 		/* IP地址的四个部分 */ 
int 		sockfd=-1; 		/* socket描述符 */ 
struct 	timeval timeout={2,0}; 		/* 超时限制 */ 
fd_set 	rmask,wmask; 				/* socket的读写屏蔽 */ /*tjb去掉struct*/ 
struct 	sockaddr_in host; 
u_long 	serverAddr; 			/* server的IP地址 */ 
int 		counter;				/* 输入文件的行数 */ 
int 		i; 					/* 文件描述符 */ 

void 	
killHandle(int sig)  /* 处理SIGTERM信号 */ 
{ 
	fprintf(out,"killed at %s\t%d\n",serverName,port); 
	exit(0); 
}

#ifdef DEBUG 

void 
sigpipeHandle(void) 
{ 
	fprintf(out,"SIGPIPE at %s\t%d\n",serverName,port); 
} 
#endif 

main(int argc,char **argv) 
{ 
	if(argc!=3) 
	{ 
		printf("Usage: %s dataFileName number\n",argv[0]); 
		exit(-1); 
	} 
	f=fopen(argv[1],"rb"); 			/* 作为输入的数据文件 */ 
	if(! f) 
	{ 
		fprintf(stdout,"open file error\n"); 
		exit(-1); 
	} 
	strcpy(result,argv[1]); 
	strcat(result,".ok"); 
	out=fopen(result,"a"); 			/* 存放结果的输出文件 */ 
	if(! out) 
	{ 
		fprintf(stdout,"open file error\n"); 
		exit(-1); 
	} 
	counter=atoi(argv[2]); 			/* 输入文件的行数 */ 
	fprintf(stdout,"Free proxy filter...\n"); 
	fprintf(stdout,"\tInput file:\t%s\n",argv[1]); 
	fprintf(stdout,"\tTotal :\t%s\n",argv[2]); 
	signal(SIGTERM,killHandle); 
	
#ifdef DEBUG /* 处理SIGPIPE信号 */ 
	signal(SIGPIPE,sigpipeHandle); 
#else 
	signal(SIGPIPE,SIG_IGN); 
#endif 

	switch(fork( )) 
	{ 
		case 0: 			/* 如果是子进程则继续 */ 
			break; 
		case -1: 			/* 如果出错则退出 */ 
			perror("fork( )"); 
			exit(-1); 
		default: 
			fclose(out); 	/* 如果是父进程则退出 */ 
			fclose(f); 
			exit(0); 
	} 
	setpgid(0, getpgrp()); 	/* 脱离终端组和进程组,成为后台进程 */ 
	 
	i=open("/dev/tty",O_RDWR); 
	if(i>=0) 
	{ 
		ioctl(i,TIOCNOTTY,0); 
		close(i); 
	}
	else 
	{ 
		fprintf(out,"TTY eacape error\n"); 
		fflush(out); 
	} 
	for ( ;counter >0;counter--) 
	{ 
		fscanf(f,"%s%d",serverName,& port); 	/* 从输入文件里读一行 */ 

#ifdef DEBUG 
		fprintf(out,"%s\t%d ...\n",serverName,port); 
#endif 
		
		bzero((char *)& host,sizeof(host)); 
		serverAddr=inet_addr(serverName); 
		host.sin_family=AF_INET; 
		host.sin_addr.s_addr=htonl(serverAddr); 
		host.sin_port=htons(port); 
		if ( (sockfd=socket(AF_INET,SOCK_STREAM,0))<0 ) 
		{ 
			fprintf(out," Error open socket at %s %d\n",serverName,port); 
			exit(-1); 
		} 
		/* 设置为非阻塞式O_NDELAY = FNDELAY = O_NONBLOCK */ 
		if(fcntl(sockfd,F_SETFL,O_NDELAY) < 0 ) 
		{ 
			fprintf(out,"fcntl() error at %s %d\n",serverName,port); 
			exit(-1); 
		}
		status=connect(sockfd,(struct sockaddr *)& host,sizeof(host)); 
		timeout.tv_sec=2; 
		timeout.tv_usec=0; 		/* 设置超时限制 */ 
		FD_ZERO( & wmask); 
		FD_SET(sockfd,& wmask); 
		status=select(sockfd+1,ZERO,& wmask, ZERO,& timeout); 
		switch(status) 
		{ 
			case -1: 
				fprintf(out,"select error\n"); 
				exit(-1); 
			case 0: 		/* 连接超时 */ 
				close(sockfd); 
				continue; 
			default: 		/* 连接成功 */ 
				if( FD_ISSET(sockfd,& wmask) ) 
					break; 
				else 
				{ 
					close(sockfd); 
					continue; 
				} 
		} 
		/* 下面一句可能会收到SIGPIPE信号,须忽略此信号 */ 
		status=write(sockfd,target,sizeof(target)); 	/* 写入GET命令给server */ 
		timeout.tv_sec=10; 
		timeout.tv_usec=0; 	/* 设置超时限制 */ 
		FD_ZERO( & rmask); 
		FD_SET(sockfd,& rmask); 
		status=select(sockfd+1,& rmask,ZERO,ZERO,& timeout); 
		switch(status) 
		{ 
			case -1: 
				fprintf(out,"select error\n"); 
				exit(-1); 
			case 0: 		/* 如果超时 */ 
				close(sockfd); 
				continue; 
			default: 		/* 连接成功 */ 
				if( FD_ISSET(sockfd,& rmask) ) 
				{ 
					bzero(buf,BUFLEN); 	/* 清缓冲区 */ 
					status=read(sockfd,buf,BUFLEN); 	/* 读server的返回结果 */ 
					close(sockfd); 
					if(status<=0) 
						continue; 		/* 没读到东西 */ 
#ifdef DEBUG 
					for(tmp=0;tmp<status;tmp++) fputc(buf[tmp],out); 
#endif 
					
					/* 下面的语句采用一个指定的主页来判断 */ 
					if( ! strncmp((buf+22),"Digital",7) )
					{
						fprintf(out,"free\t%s\t%d\n",serverName,port); 
						fflush(out); 
					}
				}
				else close(sockfd); 
		}
	}
	fclose(f); 
	fprintf(out,"Free proxy filter done.\n"); 
	fclose(out); 
}

⌨️ 快捷键说明

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