Linux软件下载源码编程文章资料.docx

上传人:b****2 文档编号:589578 上传时间:2023-04-29 格式:DOCX 页数:20 大小:47.80KB
下载 相关 举报
Linux软件下载源码编程文章资料.docx_第1页
第1页 / 共20页
Linux软件下载源码编程文章资料.docx_第2页
第2页 / 共20页
Linux软件下载源码编程文章资料.docx_第3页
第3页 / 共20页
Linux软件下载源码编程文章资料.docx_第4页
第4页 / 共20页
Linux软件下载源码编程文章资料.docx_第5页
第5页 / 共20页
Linux软件下载源码编程文章资料.docx_第6页
第6页 / 共20页
Linux软件下载源码编程文章资料.docx_第7页
第7页 / 共20页
Linux软件下载源码编程文章资料.docx_第8页
第8页 / 共20页
Linux软件下载源码编程文章资料.docx_第9页
第9页 / 共20页
Linux软件下载源码编程文章资料.docx_第10页
第10页 / 共20页
Linux软件下载源码编程文章资料.docx_第11页
第11页 / 共20页
Linux软件下载源码编程文章资料.docx_第12页
第12页 / 共20页
Linux软件下载源码编程文章资料.docx_第13页
第13页 / 共20页
Linux软件下载源码编程文章资料.docx_第14页
第14页 / 共20页
Linux软件下载源码编程文章资料.docx_第15页
第15页 / 共20页
Linux软件下载源码编程文章资料.docx_第16页
第16页 / 共20页
Linux软件下载源码编程文章资料.docx_第17页
第17页 / 共20页
Linux软件下载源码编程文章资料.docx_第18页
第18页 / 共20页
Linux软件下载源码编程文章资料.docx_第19页
第19页 / 共20页
Linux软件下载源码编程文章资料.docx_第20页
第20页 / 共20页
亲,该文档总共20页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

Linux软件下载源码编程文章资料.docx

《Linux软件下载源码编程文章资料.docx》由会员分享,可在线阅读,更多相关《Linux软件下载源码编程文章资料.docx(20页珍藏版)》请在冰点文库上搜索。

Linux软件下载源码编程文章资料.docx

Linux软件下载源码编程文章资料

用C语言编写一个网络蜘蛛来搜索网上出现的电子邮件地址

关键词:

C编程  网络蜘蛛  网络蠕虫  HTTP  Linux                                        

可能大家经常要去互联网上搜索特定的内容,比如收集大量邮件地址,如果用google之类的搜索引擎是没法实现这种特定功能的,所以用C语言来写一个吧。

它的功能就是不断去取得网络上的页面,然后分析出网页上出现的邮件地址保存下来。

象个蜘蛛一样,从网络上一个网页爬向另一个网页,不停止地搜索邮件地址。

当然这只是一个原理展示程序,并没有进行优化。

这个程序的main函数流程图如下:

即:

分析程序运行时的参数,把各网页地址作为根节点加入到链表,然后从链表头开始处理各节点

对整个链表的处理是先处理兄弟节点,流程图如下:

然后再处理各节点的子节点,流程图如下:

当然,这里采用了递归调用方法,处理子节点的数据时和处理整个链表一样循环处理就是了。

/************关于本文档********************************************

*filename:

用C语言编写一个网络蜘蛛来搜索网上出现的电子邮件地址

*purpose:

一个邮址搜索程序的雏形

*wroteby:

zhoulifa(zhoulifa@)周立发()

Linux爱好者Linux知识传播者SOHO族开发者最擅长C语言

*datetime:

2006-08-3121:

00:

00

*Note:

任何人可以任意复制代码并运用这些文档,当然包括你的商业用途

*但请遵循GPL

*Hope:

希望越来越多的人贡献自己的力量,为科学技术发展出力

*********************************************************************/

程序在运行的过程中要建立一个树形链表结构,结构图如下:

程序启动时分析所带参数,把各参数加入到根网页节点,如果有多个参数则这个根网页有兄弟节点。

然后从根节点开始处理这一级上各节点,把各节点网页上出现的网页链接加到该节点的子节点上,处理完当前这一级后处理子节点这一级。

源代码如下:

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#defineUSERAGENT"Wget/1.10.2"

#defineACCEPT"*/*"

#defineACCEPTLANGUAGE"zh-cn,zh;q=0.5"

#defineACCEPTENCODING"gzip,deflate"

#defineACCEPTCHARSET"gb2312,utf-8;q=0.7,*;q=0.7"

#defineKEEPALIVE"300"

#defineCONNECTION"keep-alive"

#defineCONTENTTYPE"application/x-www-form-urlencoded"

#defineMAXFILENAME14

#defineDEBUG1

typedefstructwebnode{

char*host;/*网页所在的主机*/

intport;/*网络服务器所使用的端口*/

char*dir;/*网页所在的目录*/

char*page;/*网页文件名*/

char*file;/*本地保存的文件名*/

charIsHandled;/*是否处理过*/

structwebnode*brother;/*兄弟节点链表指针*/

structwebnode*child;/*子节点链表指针*/

}WEBNODE;

structsockaddr_inserver_addr;

intsockfd=0,dsend=0,totalsend=0,nbytes=0,reqn=0,i=0,j=0,ret=0;

structhostent*host;

charrequest[409600]="",buffer[1024]="",httpheader[1024]="";

intFileNumber=0;

chare[2]="@/";

WEBNODE*NodeHeader,*NodeTail,*NodeCurr;

char*mapped_mem;

intGetHost(char*,char**,char**,int*,char**);/**/

voidAnalyzePage(WEBNODE*);/**/

voidAddInitNode(char*,char*,int,char*);/**/

voidHandleInitNode(WEBNODE*);/**/

voidDisplayNode(WEBNODE*);/**/

voidHandOneNode(WEBNODE*);/**/

voidDoneWithList(int);/**/

voidDoOnce();/**/

voidConnectWeb(void);/**/

voidSendRequest(void);/**/

voidReceiveResponse(void);/**/

voidGetEmail(char*);/**/

voidGetLink(char*);/**/

voidGetBeforePos(char*,char**);/**/

voidGetAfterPos(char*,char**);/**/

voidAddChildNode(WEBNODE*,char*);/**/

voidGetAfterPosWithSlash(char*,char**);/**/

voidGetMemory(char**,int);/**/

intIsExistWeb(WEBNODE*,char*,char*,int,char*);/**/

voidRstrchr(char*,int,char**);/**/

intGetLocalAgent(char*UserAgent,char*Accept,char*AcceptLanguage,char*AcceptEncoding,char*AcceptCharset,char*KeepAlive,char*Connection,char*ContentType);/**/

/**************************************************************

功能:

设置HTTP协议头内容的一些固定值

***************************************************************/

intGetLocalAgent(char*UserAgent,char*Accept,char*AcceptLanguage,char*AcceptEncoding,char*AcceptCharset,char*KeepAlive,char*Connection,char*ContentType)

{

memcpy(UserAgent,USERAGENT,strlen(USERAGENT));

memcpy(Accept,ACCEPT,strlen(ACCEPT));

memcpy(AcceptLanguage,ACCEPTLANGUAGE,strlen(ACCEPTLANGUAGE));

memcpy(AcceptEncoding,ACCEPTENCODING,strlen(ACCEPTENCODING));

memcpy(AcceptCharset,ACCEPTCHARSET,strlen(ACCEPTCHARSET));

memcpy(KeepAlive,KEEPALIVE,strlen(KEEPALIVE));

memcpy(Connection,CONNECTION,strlen(CONNECTION));

memcpy(ContentType,CONTENTTYPE,strlen(CONTENTTYPE));

return0;

}

/**************************************************************

功能:

在字符串s里搜索x字符,并设置指针d指向该位置

***************************************************************/

voidRstrchr(char*s,intx,char**d)

{

intlen=strlen(s)-1;

while(len>=0){

if(x==s[len]){(*d)=s+len;return;}

len--;

}

(*d)=0;

}

/**************************************************************

功能:

连接一个网站服务器

***************************************************************/

voidConnectWeb(void){/*connecttowebserver*/

/*createasocketdescriptor*/

if((sockfd=socket(PF_INET,SOCK_STREAM,0))==-1)

{

fprintf(stderr,"\tSocketError:

%s\a\n",strerror(errno));

exit

(1);

}

/*bindaddress*/

bzero(&server_addr,sizeof(server_addr));

server_addr.sin_family=AF_INET;

server_addr.sin_port=htons(NodeCurr->port);

server_addr.sin_addr=*((structin_addr*)host->h_addr);

/*connecttotheserver*/

if(connect(sockfd,(structsockaddr*)(&server_addr),sizeof(structsockaddr))==-1)

{

fprintf(stderr,"\tConnectError:

%s\a\n",strerror(errno));

exit

(1);

}

}

/**************************************************************

功能:

向网站发送HTTP请求

***************************************************************/

voidSendRequest(void){/*sendmyhttp-requesttowebserver*/

dsend=0;totalsend=0;

nbytes=strlen(request);

while(totalsend

dsend=write(sockfd,request+totalsend,nbytes-totalsend);

if(dsend==-1){fprintf(stderr,"\tsenderror!

%s\n",strerror(errno));exit(0);}

totalsend+=dsend;

fprintf(stdout,"\n\tRequest.%d%dbytessendOK!

\n",reqn,totalsend);

}

}

/**************************************************************

功能:

接收网站的HTTP返回

***************************************************************/

voidReceiveResponse(void){/*getresponsefromwebserver*/

fd_setwritefds;

structtimevaltival;

intretry=0;

FILE*localfp=NULL;

i=0;j=0;

__ReCeive:

FD_ZERO(&writefds);

tival.tv_sec=10;

tival.tv_usec=0;

if(sockfd>0)FD_SET(sockfd,&writefds);

else{fprintf(stderr,"\n\tError,socketisnegative!

\n");exit(0);}

ret=select(sockfd+1,&writefds,NULL,NULL,&tival);

if(ret==0){

if(retry++<10)goto__ReCeive;

}

if(ret<=0){fprintf(stderr,"\n\tErrorwhilereceiving!

\n");exit(0);}

if(FD_ISSET(sockfd,&writefds)){

memset(buffer,0,1024);

memset(httpheader,0,1024);

if((localfp=fopen(NodeCurr->file,"w"))==NULL){if(DEBUG)fprintf(stderr,"createfile'%s'error\n",NodeCurr->file);return;}

/*receivedatafromwebserver*/

while((nbytes=read(sockfd,buffer,1))==1)

{

if(i<4){/*获取HTTP消息头*/

if(buffer[0]=='\r'||buffer[0]=='\n')i++;

elsei=0;

memcpy(httpheader+j,buffer,1);j++;

}

else{/*获取HTTP消息体*/

fprintf(localfp,"%c",buffer[0]);/*printcontentonthescreen*/

//fprintf(stdout,"%c",buffer[0]);/*printcontentonthescreen*/

i++;

}

}

fclose(localfp);

}

}

/**************************************************************

功能:

执行一次HTTP请求

***************************************************************/

voidDoOnce(){/*sendandreceive*/

ConnectWeb();/*connecttothewebserver*/

/*sendarequest*/

SendRequest();

/*receivearesponsemessagefromwebserver*/

ReceiveResponse();

close(sockfd);/*becauseHTTPprotocoldosomethingoneconnection,soIcancloseitafterreceiving*/

}

/**************************************************************

功能:

执行HTTP请求

***************************************************************/

voidDoneWithList(intflag){

if(flag)fprintf(stdout,"\tRequest.%dis:

\n%s",++reqn,request);

DoOnce();

if(flag)fprintf(stdout,"\n\tThefollowingistheresponseheader:

\n%s",httpheader);

}

/**************************************************************

功能:

从字符串src中分析出网站地址和端口,并得到文件和目录

***************************************************************/

intGetHost(char*src,char**web,char**file,int*port,char**dir){

char*pA,*pB,*pC;

intlen;

*port=0;

if(!

(*src))return-1;

pA=src;

if(!

strncmp(pA,"http:

//",strlen("http:

//")))pA=src+strlen("http:

//");

/*elseif(!

strncmp(pA,"https:

//",strlen("https:

//")))pA=src+strlen("https:

//");*/

elsereturn1;

pB=strchr(pA,'/');

if(pB){

len=strlen(pA)-strlen(pB);

GetMemory(web,len);

memcpy((*web),pA,len);

if(*(pB+1)){

Rstrchr(pB+1,'/',&pC);

if(pC)len=strlen(pB+1)-strlen(pC);

elselen=0;

if(len>0){

GetMemory(dir,len);

memcpy((*dir),pB+1,len);

if(pC+1){

len=strlen(pC+1);

GetMemory(file,len);

memcpy((*file),pC+1,len);

}

else{

len=1;

GetMemory(file,len);

memcpy((*file),e,len);

}

}

else{

len=1;

GetMemory(dir,len);

memcpy((*dir),e+1,len);

len=strlen(pB+1);

GetMemory(file,len);

memcpy((*file),pB+1,len);

}

}

else{

len=1;

GetMemory(dir,len);

memcpy((*dir),e+1,len);

len=1;

GetMemory(file,len);

memcpy((*file),e,len);

}

}

else{

len=strlen(pA);

GetMemory(web,len);

memcpy((*web),pA,strlen(pA));

len=1;

GetMemory(dir,len);

memcpy((*dir),e+1,len);

len=1;

GetMemory(file,len);

memcpy((*file),e,len);

}

pA=strchr((*web),':

');

if(pA)*port=atoi(pA+1);

else*port=80;

return0;

}

/*********************************************************************

*filename:

mailaddrsearch.c

*purpose:

用C语言编写一个网络蜘蛛来搜索网上出现的电子邮件地址

*tidiedby:

zhoulifa(zhoulifa@)周立发()

Linux爱好者Linux知识传播者SOHO族开发者最擅长C语言

*datetime:

2006-08-3121:

00:

00

*Note:

任何人可以任意复制代码并运用这些文档,当然包括你的商业用途

*但请遵循GPL

*Thanksto:

www.gd-linux.org广东省Linux公共服务技术支持中心

*********************************************************************/

intmain(intargc,char**argv)

{

intWebPort;

char*WebHost=0,*PageAddress=0,*We

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 党团工作 > 入党转正申请

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2