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

📄 htmlvery.c

📁 Linux网络编程教程适合初学者入门学习
💻 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 + -