收藏 分销(赏)

VC++搜索引擎网络爬虫设计与实现.doc

上传人:pc****0 文档编号:5702413 上传时间:2024-11-15 格式:DOC 页数:75 大小:1.42MB
下载 相关 举报
VC++搜索引擎网络爬虫设计与实现.doc_第1页
第1页 / 共75页
VC++搜索引擎网络爬虫设计与实现.doc_第2页
第2页 / 共75页
VC++搜索引擎网络爬虫设计与实现.doc_第3页
第3页 / 共75页
VC++搜索引擎网络爬虫设计与实现.doc_第4页
第4页 / 共75页
VC++搜索引擎网络爬虫设计与实现.doc_第5页
第5页 / 共75页
点击查看更多>>
资源描述

1、搜索引擎网络爬虫设计与实现摘要网络中的资源非常丰富,但是如何有效的搜索信息却是一件困难的事情。建立搜索引擎就是解决这个问题的最好方法。本文首先详细介绍了基于英特网的搜索引擎的系统结构,然后具体阐述了如何设计并实现搜索引擎的搜索器网络爬虫。多线程网络爬虫程序是从指定的Web页面中按照宽度优先算法进行解析、搜索,并把搜索到的每条URL进行抓取、保存并且以URL为新的入口在互联网上进行不断的爬行的自动执行后台程序。网络爬虫主要应用socket套接字技术、正则表达式、HTTP协议、windows网络编程技术等相关技术,以C+语言作为实现语言,并在VC6.0下调试通过。 在网络爬虫的设计与实现的章节中除

2、了详细的阐述技术核心外还结合了多线程网络爬虫的实现代码来说明,易于理解。本网络爬虫是一个能够在后台运行的以配置文件来作为初始URL,以宽度优先算法向下爬行,保存目标URL的网络程序,能够执行普通用户网络搜索任务。关键词搜索引擎;网络爬虫;URL搜索器;多线程Design and Realization of Search Engine Network SpiderAbstractThe resource of network is very rich, but how to search the effective information is a difficult task. The es

3、tablishment of a search engine is the best way to solve this problem. This paper first introduces the internet-based search engine structure, and then illustrates how to implement search engine -network spiders.The multi-thread network spider procedure is from the Web page which assigns according to

4、 the width priority algorithm connection for analysis and search, and each URL is snatched and preserved, and make the result URL as the new source entrance unceasing crawling on internet to carry out the backgoud automatically.My paper of network spider mainly applies to the socket technology, the

5、regular expression, the HTTP agreement, the windows network programming technology and other correlation technique, and taking C+ language as implemented language, and passes under VC6.0 debugging.In the chapter of the spider design and implementation, besides a detailed exposition of the core techn

6、ology in conjunction with the multi-threaded network spider to illustrate the realization of the code, it is easy to understand. This network spiders is initial URL based on configuration files which can operate on background,using width priority algorithm to crawl down, preserving network programme

7、 of target URL.Keywords Internet search engine; Network spider; URL search programme; Multithreaded不要删除行尾的分节符,此行不会被打印- II -目录摘要IAbstractII第1章 绪论11.1 课题背景11.2 搜索引擎的历史和分类21.2.1 搜索引擎的历史21.2.2 搜索引擎的分类21.3 搜索引擎的发展趋势31.4 搜索引擎的组成部分41.5 课题研究的主要内容4第2章 网络爬虫的技术要点分析62.1 网络爬虫Spider工作原理62.1.1 Spider 的概念62.1.2 网络爬

8、虫抓取内容分析62.2 HTTP协议72.2.1 HTTP协议的请求72.2.2 HTTP协议的响应82.2.3 HTTP的消息报头82.3 SOCKET套接字102.3.1 什么是SOCKET套接字102.3.2 SOCKET各函数分析102.4 正则表达式142.4.1 正则表达式应用分析142.4.2 正则表达式的元字符分析152.5 本章总结15第3章 网络爬虫系统模型的分析和概要设计163.1 网络爬虫模型分析163.1.1 单线程爬虫模型分析163.1.2 多线程爬虫模型分析163.1.3 爬虫集群模型分析173.2 网络爬虫的搜索策略的分析与设计173.3 网络爬虫主要性能评价指

9、标分析203.4 本论文中网络爬虫的概要设计20第4章 网络爬虫的详细设计与实现234.1 网络爬虫总体设计234.2 Socket功能模块的设计与实现244.2.1 Socket功能模块的设计244.2.2 Socket功能模块的具体实现244.2.3 Socket模块中各功能函数模块中的调用关系设计314.3 HTTP 功能模块的设计与实现334.3.1 HTTP协议与URL334.3.2 依照HTTP协议设计send()函数发送信息334.4 正则表达式过滤模块的设计与实现354.4.1 URL正则表达式的定义与实现354.4.2 开源正则表达式引擎DEELX的应用374.4.3 Mat

10、chResult 类的调用和设计384.5 URL保存模块的设计与实现394.6 宽度搜索模块的设计与实现394.7 文件存储模块的设计与实现414.8 多线程的设计与实现424.9 运行显示结果424.9.1 输入424.9.2 显示434.9.3 结果434.10 本章总结44结论45致谢46参考文献47附录48千万不要删除行尾的分节符,此行不会被打印。在目录上点右键“更新域”,然后“更新整个目录”。打印前,不要忘记把上面“Abstract”这一行后加一空行- IV -第1章 绪论1.1 课题背景面对浩瀚的网络资源,搜索引擎为所有网上冲浪的用户提供了一个入口,毫不夸张的说,所有的用户都可以

11、从搜索出发到达自己想去的网上任何一个地方。因此它也成为除了电子邮件以外最多人使用的网上服务。什么是搜索引擎?它是如何工作的?搜索引擎一词在国内外因特网领域被广泛使用,然而他的含义却不尽相同。在美国搜索引擎通常指的是基于因特网的搜索引擎,他们通过网络机器人程序收集上千万到几亿个网页,并且每一个词都被搜索引擎索引,也就是我们说的全文检索。著名的因特网搜索引擎包括First Search、Google、HotBot等。在中国,搜索引擎通常指基于网站目录的搜索服务或是特定网站的搜索服务,本人这里研究的是基于因特网的搜索技术。广义的搜索引擎泛指网络(尤其是万维网)上提供信息检索服务的工具或系统,即在因特

12、网上或通过因特网响应用户的搜索请求,返回相应查询结果的信息技术和系统.狭义的搜索引擎主要指利用网络自动搜索软件或人工方式,对万维网信息资源进行采集,分析与标引,并将索引信息组织成数据库,以网站形式为网络用户提供检索服务的一类信息服务系统.概括的说:搜索引擎就是WWW网络环境中的一套信息检索系统。它通常有两种不同的工作方式:一种是分类目录型的检索,把因特网中的资源收集起来,由其提供的资源的类型不同而分成不同的目录,再一层层地进行分类,人们要找自己想要的信息可按他们的分类一层层进入,就能最后到达目的地,找到自己想要的信息;另一种是基于关键词(Keyword)的检索,这种方式用户可以用逻辑组合方式输

13、入各种关键词,搜索引擎计算机根据这些关键词寻找用户所需资源的地址,然后根据一定的规则反馈给用户包含此关键字词信息的所有网址和指向这些网址的链接。搜索引擎其实也就是一个网站,只不过该网站专门为你提供信息“检索”服务,它使用特有的程序把INTERNET上的所有信息归类以帮助人们在浩如烟海的信息海洋中搜寻到自己所需要的信息。随着因特网信息按几 何级数增长,这些搜索引擎利用其内部的一个spider程序,自动搜索网站每一页的开始,并把每一页上代表超级链接的所有词汇放入一个数据库,供用户来查询。1.2 搜索引擎的历史和分类搜索引擎的历史。1990年以前,没有任何人能搜索互联网。所有搜索引擎的祖先,是199

14、0年由 Montreal的McGill University学生Alan Emtage、Peter Deutsch、Bill Wheelan发明的Archie。后来,程序员们开发出了一个名叫“spider”(爬虫)的“Robot”(机器人)程序,它能自动以人类无法达到的速度不断重复地在网络上检索信息。这种行为很像一只爬虫在INTERNET这张巨大的信息网上爬来爬去,因此,spider程序便由此而来。世界上第一个Spider程序,是MIT Matthew Gray的World wide Web Wanderer,用于追踪互联网发展规模。刚开始它只用来统计互联网上的服务器数量,后来发展为也能够捕获

15、网址(URL)1。1.2.1 搜索引擎的历史搜索引擎技术伴随着WWW的发展是引人注目的。搜索引擎大约经历了三代的更新发展: 第一代搜索引擎出现于1994年。这类搜索引擎一般都索引少于1,000,000个网页,极少重新搜集网页并去刷新索引。而且其检索速度非常慢,一般都要等 待10秒甚至更长的时间。在实现技术上也基本沿用较为成熟的IR(Information Retrieval)、网络、数据库等技术,相当于利用一些已有技术实现的一个WWW上的应用。在1994年3月到4月,网络爬虫(Spider)World Web Worm (WWW)平均每天承受大约1500次查询。 大约在1996年出现的第二代搜

16、索引擎系统大多采用分布式方案(多个微型计算机协同工作)来提高数据规模、响应速度和用户数量,它们一般都保持一个大约5千万网页个的索引数据库,每天能够响应1千万次 用户检索请求。1997年11月,当时最先进的几个搜索引擎号称能建立从2百万到1亿的网页索引。Altavista搜索引擎声称他们每天大概要承受2千万次查询。 2000年搜索引擎2000年大会上,按照Google公司总裁Larry Page的演讲,Google正在用3千台运行Linux系统的个人电脑在搜集Web上的网页,而且以每天30台的速度向这个微机集群里添加电脑,以保持与网络的发展相同步。每台微机运行多个爬虫程序搜集网页的峰值速度是每秒

17、100个网页,平均速度是每秒48.5个网页,一天可以搜集超过4百万个网页。1.2.2 搜索引擎的分类搜索引擎按其工作方式主要可分为三种,分别是全文搜索引擎(Full Text Search Engine)、目录索引类搜索引擎(Search Index/Directory)和元搜索引擎(Meta Search Engine)。全文搜索引擎是名副其实的搜索引擎,国外具代表性的有Google、Fast/AllTheWeb、AltaVista、Inktomi、 Teoma、WiseNut等,国内著名的有百度(Baidu)。它们都是通过从互联网上提取的各个网站的信息(以网页文字为主)而建立的数据库中,检

18、索 与用户查询条件匹配的相关记录,然后按一定的排列顺序将结果返回给用户,因此他们是真正的搜索引擎。目录索引虽然有搜索功能,但在严格意义上算不上是真正的搜索引擎,仅仅是按目录分类的网站链接列表而已。用户完全可以不用进行关键词(Keywords) 查询,仅靠分类目录也可找到需要的信息。目录索引中最具代表性的莫过于大名鼎鼎的Yahoo雅虎。其他著名的还有Open Directory Project(DMOZ)、LookSmart、About等。国内的搜狐、新浪、网易搜索也都属于这一类2。元搜索引擎在接受用户查询请求时,同时在其他多个引擎上进行搜索,并将结果返回给用户。著名的元搜索引擎有InfoSpa

19、ce、Dogpile、Vivisimo等(元搜索引擎列表),中文元搜索引擎中具代表性的有搜星搜索引擎。在搜索结果排列方面,有的直接按来源引擎排列搜索结果,如Dogpile,有的则按自定的规则将结果重新排列组合,如Vivisimo。1.3 搜索引擎的发展趋势搜索引擎经过几年的发展和摸索,越来越贴近人们的需求,搜索引擎的技术也得到了很大的发展。搜索引擎的最新技术发展包括以下几个方面:为了提高搜索引擎对用户检索提问的理解,就必须有一个好的检索提问语言,为了克服关键词检索和目录查询的缺点,现在已经出现了自然语言智能答询。用户可以输入简单的疑问句,比如“how can kill virus of com

20、puter?”。搜索引擎在对提问进行结构和内容的分析之后,或直接给出提问的答案,或引导用户从几个可选择的问题中进行再选择。自然语言的优势在于,一是使网络交流更加人性化,二是使查询变得更加方便、直接、有效。1.基于链接评价的搜索引擎基于链接评价的搜索引擎的优秀代表是Googel,它独创的“链接评价体系”是基于这样一种认识,一个网页的重要性取决于它被其它网页链接的数量,特别是一些已经被认定是“重要”的网页的链接数量。2.基于访问大众性的搜索引擎 基于访问大众性的搜索引擎的代表是direct hit,它的基本理念是多数人选择访问的网站就是最重要的网站。根据以前成千上万的网络用户在检索结果中实际所挑选

21、并访问的网站和他们在这些网站上花费的时间来统计确定有关网站的重要性排名,并以此来确定哪些网站最符合用户的检索要求。因此具有典型的趋众性特点。这种评价体制与基于链接评价的搜索引擎有着同样的缺点。 3.去掉检索结果中附加的多余信息 有调查指出,过多的附加信息加重了用户的信息负担,为了去掉这些过多的附加信息,可以采用用户定制、内容过滤等检索技术。 确定搜索引擎信息搜集范围,提高搜索引擎的针对性 1.4 搜索引擎的组成部分一个搜索引擎大致由三部分组成。第一部分是搜索器,也就是上面提到的Spider程序。它定期的自动爬到各个网站上,把网页抓下来,并顺着上面的链接,象爬虫一样爬开去,持续不断的抓取网页。第

22、二部分是索引器,它把爬虫程序抓来网页进行分析,按照关键词句进行索引,并存入服务器的数据库中。第三部分是面向用户的检索器,它接收用户提交的查询字串,在索引数据库中查询,并将结果反馈给用户。因此,准确的说,当我们利用搜索引擎搜索信息时,并不是真正在网上进行搜索,而是在检索那个由爬虫程序自动建立起来的庞大的数据库。由于各大搜索引擎的数据库的自动更新周期是不同的,从几天到几周甚至一个月都有可能,因此,选择合适的搜索引擎显得尤为重要。同时,有时也可能遇到用搜索引擎搜索到的网页无法打开的情况,了解了它的工作原理,这一点也就不会大惊小怪了3。1.5 课题研究的主要内容 本论文主要研究搜索引擎的搜索器(Spi

23、der程序)的设计与实现,详细介绍Spider程序的概念及技术要点,算法介绍,并用C+语言实现简单的可在后台自动运行的爬虫程序网络爬虫程序,是一种专业的Bot程序。用于查找大量的Web页面。它从一个简单Web页面上开始执行,然后通过其超链接在访问其他页面,如此反复理论上可以扫描互联网上的所有页面。基于因特网的搜索引擎是Spider的最早应用。例如搜索巨头Google公司,就利用网络机器人程序来遍历Web站点,以创建并维护这些大型数据库。网络机器人还可以通过扫描Web站点的主页来得到这个站点的文件清单和层次机构。还可以扫描出中断的超链接和拼写错误等。然而Internet是建立在很多相关协议基础上

24、的,而更复杂的协议又建立在系统层协议之上。Web就是建立在HTTP ( Hypertext Transfer Protocol ) 协议基础上,而HTTP又是建立在TCP/IP ( Transmission Control Protocol / Internet Protocol ) 协议之上,它同时也是一种Socket协议。所以网络爬虫本质上是一种基于Socket的网络程序。本论文中网络爬虫的关键技术如下:SOCKET套接字技术,HTTP协议技术,正则表达式技术。以多线程网络爬虫模型为设计基础,应用SOCKET套接字相关函数按照HTTP协议向源URL发送请求,并以正则表达式过滤所接受到的网页

25、标签,得到目标URL,再将目标URL重新作为源URL进行新的一轮向下爬行搜索,按照宽度优先算法向下爬行,从而完成整个Network Spider的爬行工作。总的来说本论文的网络爬虫是一个能够在后台运行的以配置文件来作为初始URL,以宽度优先算法向下爬行,保存目标URL的网络爬虫程序。第2章 网络爬虫的技术要点分析2.1 网络爬虫Spider工作原理2.1.1 Spider 的概念搜索引擎一直专注于提升用户的体验度,其用户体验度则反映在三个方面: 准、全、快 。用专业术语讲是:查准率、查全率和搜索速度(即搜索耗时)。其中最易达到的是搜索速度,因为对于搜索耗时在1秒以下的系统来说,访问者很难辨别其

26、快慢 了,更何况还有网络速度的影响。因此,对搜索引擎的评价就集中在了前两者:准、全。中文搜索引擎的“准”,需要保证搜索的前几十条结果都和搜索词十分相关,这需由“分词技术”和“排序技术”来决定。中文搜索引擎的“全”则需保证不遗漏某些重要的结果,而且能找到最新的网页,这需要搜索引擎有一个强大的网页收集器,一般称为“网络爬虫”,也有叫“网页机器人”。这就是本论文所研究的目标。网络爬虫即Network Spider,是一个很形象的名字。把互联网比喻成一个爬虫网,那么Spider就是在网上爬来爬去的爬虫。网络爬虫是通过网页的链接地址来寻找网页,从网站某一个页面(通常是首页)开始,读取网页的内容,找到在网

27、页中的其它链接地址,然后通过这些链接地址寻找下一个网页,这样一直循环下去,直到把这个网站所有的网页都抓取完为止。如果把整个互联网当成一个网站,那么网络爬虫就可以用这个原理把互联网上所有的网页都抓取下来。对于搜索引擎来说,要抓取互联网上所有的网页几乎是不可能的,从目前公布的数据来看,容量最大的搜索引擎也不过是抓取了整个网页数量的百分之四十左右。这其中的原因一方面是抓取技术的瓶颈,无法遍历所有的网页,有许多网页无法从其它网页的链接中找到;另一个原因是存储技术和处理技术的问题,如果按照每个页 面的平均大小为20K计算(包含图片),100亿网页的容量是1002000G字节,即使能够存储,下载也存在问题

28、(按照一台机器每秒下载20K计算, 需要340台机器不停的下载一年时间,才能把所有网页下载完毕)。同时,由于数据量太大,在提供搜索时也会有效率方面的影响。因此,许多搜索引擎的网络爬虫只是抓取那些重要的网页,而在抓取的时候评价重要性主要的依据是某个网页的链接深度。2.1.2 网络爬虫抓取内容分析1.静态网页抓取内容分析:爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL,在抓取网页的过程中,不断从当前页面上抽取新的URL放入队列,直到满足系统的一定停止条件。 2.动态网页抓取内容分析:分析动态网页参数,按照一定规章,“拼”出所有要被抓取内容URL,只抓取这些特定范围内动态网页。3.特殊

29、内容抓取内容分析:比如RSS、XML数据,情况特殊需特殊处理。如新闻的滚动新闻页面,需要爬虫不停地监控扫描,发现新内容马上就进行抓取。4.文件对象抓取内容分析:图片,MP3、Flash、视频等文件的抓取,都要特殊处理。比如说:图片抓取出来后,要知道图片文件类型、图片文件的大小、图片的像素大小,还要转换出来缩略图。2.2 HTTP协议2.2.1 HTTP协议的请求 http请求由三部分组成,分别是:请求行、消息报头、请求正文请求行以一个方法符号开头,以空格分开,后面跟着请求的URI和协议的版本,格式如下:Method Request-URI HTTP-Version CRLF 其中 Method

30、表示请求方法;Request-URI是一个统一资源标识符;HTTP-Version表示请求的HTTP协议版本;CRLF表示回车和换行(除了作为结尾的CRLF外,不允许出现单独的CR或LF字符)。请求方法(所有方法全为大写)有多种,请求方法解释表如表2-1所示。表2-1 请求方法表GET请求获取Request-URI所标识的资源POST在Request-URI所标识的资源后附加新的数据HEAD请求获取由Request-URI所标识的资源的响应消息报头PUT请求服务器存储一个资源,并用Request-URI作为其标识DELETE请求服务器删除Request-URI所标识的资源TRACE请求服务器回

31、送收到的请求信息,主要用于测试或诊断应用举例:GET方法:在浏览器的地址栏中输入网址的方式访问网页时,浏览器采用GET方法向服务器获取资源。POST方法要求被请求服务器接受附在请求后面的数据,常用于提交表单。HEAD方法与GET方法几乎是一样的,对于HEAD请求的回应部分来说,它的HTTP头部中包含的信息与通过GET请求所得到的信息是相同的。利用这个方法,不必传输整个资源内容,就可以得到Request-URI所标识的资源的信息。该方法常用于测试超链接的有效性,是否可以访问,以及最近是否更新。在本论文中网络爬虫的http请求部分将用GET方法。2.2.2 HTTP协议的响应HTTP响应也是由三个

32、部分组成,分别是:状态行、消息报头、响应正文状态行格式如下:HTTP-Version Status-Code Reason-Phrase CRLF。其中,HTTP-Version表示服务器HTTP协议的版本;Status-Code表示服务器发回的响应状态代码;Reason-Phrase表示状态代码的文本描述。状态代码有三位数字组成,第一个数字定义了响应的类别,且有五种可能取值:1xx:指示信息-表示请求已接收,继续处理2xx:成功-表示请求已被成功接收、理解、接受3xx:重定向-要完成请求必须进行更进一步的操作4xx:客户端错误-请求有语法错误或请求无法实现5xx:服务器端错误-服务器未能实现

33、合法的请求响应报头与响应正文略。2.2.3 HTTP的消息报头HTTP消息由客户端到服务器的请求和服务器到客户端的响应组成。请求消息和响应消息都是由开始行(对于请求消息,开始行就是请求行,对于响应消息,开始行就是状态行),消息报头(可选),空行(只有CRLF的行),消息正文(可选)组成。HTTP消息报头包括普通报头、请求报头、响应报头、实体报头。每一个报头域都是由名字+“:”+空格+值 组成,消息报头域的名字是大小写无关的。1.普通报头在普通报头中,有少数报头域用于所有的请求和响应消息,但并不用于被传输的实体,只用于传输的消息。请求时的缓存指令包括:no-cache(用于指示请求或响应消息不能

34、缓存)、no-store、max-age、max-stale、min-fresh、only-if-cached;响应时的缓存指令包括:public、private、no-cache、no-store、no-transform、must-revalidate、proxy-revalidate、max-age、s-maxage.2.请求报头请求报头允许客户端向服务器端传递请求的附加信息以及客户端自身的信息。常用的请求报头包括:Accept:Accept请求报头域用于指定客户端接受哪些类型的信息。Accept-Charset:Accept-Charset请求报头域用于指定客户端接受的字符集。Acce

35、pt-Encoding:Accept-Encoding请求报头域类似于Accept,但是它是用于指定可接受的内容编码。eg:Accept-Encoding:gzip.deflate.如果请求消息中没有设置这个域服务器假定客户端对各种内容编码都可以接受。Accept-Language:Accept-Language请求报头域类似于Accept,但是它是用于指定一种自然语言。Authorization:Authorization请求报头域主要用于证明客户端有权查看某个资源。当浏览器访问一个页面时,如果收到服务器的响应代码为401(未授权),可以发送一个包含Authorization请求报头域的请求

36、,要求服务器对其进行验证。Host(发送请求时,该报头域是必需的):Host请求报头域主要用于指定被请求资源的Internet主机和端口号,它通常从HTTP URL中提取出来的。3.响应报头响应报头允许服务器传递不能放在状态行中的附加响应信息,以及关于服务器的信息和对Request-URI所标识的资源进行下一步访问的信息。常用的响应报头包括:Location:Location响应报头域用于重定向接受者到一个新的位置。Location响应报头域常用在更换域名的时候。Server:Server响应报头域包含了服务器用来处理请求的软件信息。与User-Agent请求报头域是相对应的。4.实体报头请求

37、和响应消息都可以传送一个实体。一个实体由实体报头域和实体正文组成,但并不是说实体报头域和实体正文要在一起发送,可以只发送实体报头域。实体报头定义了关于实体正文和请求所标识的资源的元信息。常用的实体报头包括:Content-Encoding:Content-Encoding实体报头域被用作媒体类型的修饰符,它的值指示了已经被应用到实体正文的附加内容的编码,因而要获得Content-Type报头域中所引用的媒体类型,必须采用相应的解码机制。Content-Encoding这样用于记录文档的压缩方法。Content-Language:Content-Language实体报头域描述了资源所用的自然语言

38、。没有设置该域则认为实体内容将提供给所有的语言阅读者。Content-Length:Content-Length实体报头域用于指明实体正文的长度,以字节方式存储的十进制数字来表示。Content-Type:Content-Type实体报头域用语指明发送给接收者的实体正文的媒体类型。Expires:Expires实体报头域给出响应过期的日期和时间6。2.3 SOCKET套接字2.3.1 什么是SOCKET套接字简单的说就是通信的两方的一种约定,用套接字中的相关函数来完成通信过程应用层通过传输层进行数据通信时,TCP和UDP会遇到同时为多个应用程序进程提供并发服务的问题。多个TCP连接或多个应用程

39、序进程可能需要通过同一个 TCP协议端口传输数据。为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCPIP协议交互提供了称为套接字(Socket)的接口。 区分不同应用程序进程间的网络通信和连接,主要有3个参数:通信的目标IP地址、使用的传输层协议(TCP或UDP)和使用的端口号。 Socket原意是“插座”。通过将这3个参数结合起来,与一个“插座”Socket绑定,应用层就可以和传输层通过套接字接口,区分来自不同应用程序进程或网络连接的通信,实现数据传输的并发服务。2.3.2 SOCKET各函数分析1.WSAStartup函数int WSAStartup( WORD wVe

40、rsionRequested, LPWSADATA lpWSAData);使用Socket的程序在使用Socket之前必须调用WSAStartup函数。该函数的第一个参数指明程序请求使用的Socket版本,其中 高位字节指明副版本、低位字节指明主版本;操作系统利用第二个参数返回请求的Socket的版本信息。当一个应用程序调用WSAStartup函数时,操 作系统根据请求的Socket版本来搜索相应的Socket库,然后绑定找到的Socket库到该应用程序中。以后应用程序就可以调用所请求的 Socket库中的其它Socket函数了。该函数执行成功后返回0。 2.WSACleanup函数 int

41、WSACleanup (void);应用程序在完成对请求的Socket库的使用后,要调用WSACleanup函数来解除与Socket库的绑定并且释放Socket库所占用的系统资源。 3.socket函数 SOCKET socket( int af, int type, int protocol );应用程序调用socket函数来创建一个能够进行网络通信的套接字。第一个参数指定应用程序使用的通信协议的协议族,对于TCP/IP协议族,该 参数置PF_INET;第二个参数指定要创建的套接字类型,流套接字类型为SOCK_STREAM、数据报套接字类型为SOCK_DGRAM;第三个参数 指定应用程序所使

42、用的通信协议。该函数如果调用成功就返回新创建的套接字的描述符,如果失败就返回INVALID_SOCKET。套接字描述符是一个整数类型的值。每个进程的进程空间里都有一个套接字描述符表,该表中存放着套接字描述符和套接字数据结构的对应关系。该表中有一个字段存放新创建的套接字的描述符,另一个字段存放套接字数据结构的地址,因此根据套接字描述符就可以找到其对应的套接字数据结构。每个进程在自己的进程空间里都有一个套接字描述符表,但是套接字数据结构都是在操作系统的内核缓冲里。4.closesocket函数 int closesocket( SOCKET s );closesocket函数用来关闭一个描述符为s

43、套接字。由于每个进程中都有一个套接字描述符表,表中的每个套接字描述符都对应了一个位于操作 系统缓冲区中的套接字数据结构,因此有可能有几个套接字描述符指向同一个套接字数据结构。套接字数据结构中专门有一个字段存放该结构的被引用次数,即有多少个套接字描述符指向该结构。当调用closesocket函数时,操作系统先检查套接字数据结构中的该字段的值,如果为1,就表明只有一个套接字描述符 指向它,因此操作系统就先把s在套接字描述符表中对应的那条表项清除,并且释放s对应的套接字数据结构;如果该字段大于1,那么操作系统仅仅清除s在套接 字描述符表中的对应表项,并且把s对应的套接字数据结构的引用次数减1。 cl

44、osesocke函数如果执行成功就返回0,否则返回SOCKET_ERROR。 5.send函数 int send( SOCKET s, const char FAR *buf, int len, int flags );不论是客户还是服务器应用程序都用send函数来向TCP连接的另一端发送数据。客户程序一般用send函数向服务器发送请求,而服务器则通常用 send函数来向客户程序发送应答。该函数的第一个参数指定发送端套接字描述符;第二个参数指明一个存放应用程序要发送数据的缓冲区;第三个参数指明实际 要发送的数据的字节数;第四个参数一般置0。这里只描述同步Socket的send函数的执行流程。当

45、调用该函数时,send先比较待发送数据的长度len和套接字s的发送缓冲区的长度,如果len大于s的发送缓冲区的长度,该函数返回SOCKET_ERROR;如果len小于或者等于s的发送缓冲区 的长度,那么send先检查协议是否正在发送s的发送缓冲中的数据,如果是就等待协议把数据发送完,如果协议还没有开始发送s的发送缓冲中的数据或者s的 发送缓冲中没有数据,那么send就比较s的发送缓冲区的剩余空间和len,如果len大于剩余空间大小send就一直等待协议把s的发送缓冲中的数据发 送完,如果len小于剩余空间大小send就仅仅把buf中的数据copy到剩余空间里。 6.recv函数int recv

46、( SOCKET s, char FAR *buf, int len, int flags );不论是客户还是服务器应用程序都用recv函数从TCP连接的另一端接收数据。该函数的第一个参数指定接收端套接字描述符;第二个参数指明一个缓 冲区,该缓冲区用来存放recv函数接收到的数据;第三个参数指明buf的长度;第四个参数一般置0。这里只描述同步Socket的recv函数的执行流 程。当应用程序调用recv函数时,recv先等待s的发送缓冲中的数据被协议传送完毕,如果协议在传送s的发送缓冲中的数据时出现网络错误,那么 recv函数返回SOCKET_ERROR,如果s的发送缓冲中没有数据或者数据被协

47、议成功发送完毕后,recv先检查套接字s的接收缓冲区,如果s接收 缓冲区中没有数据或者协议正在接收数据,那么recv就一直等待,只到协议把数据接收完毕。当协议把数据接收完毕,recv函数就把s的接收缓冲中的数据copy到buf中。 7.bind函数int bind( SOCKET s, const struct sockaddr FAR *name, int namelen );当创建了一个Socket以后,套接字数据结构中有一个默认的IP地址和默认的端口号。一个服务程序必须调用bind函数来给其绑定一个IP地址 和一个特定的端口号。客户程序一般不必调用bind函数来为其Socket绑定IP地址和断口号。该函数的第一个参数指定待绑定的Socket描述符;第二个参数指定一个sockaddr结构。8.listen函数int listen( SOCKET s, int backlog ); 服务程序可以调用listen函数使其流套接字s处于监听状态。处于监听状态的流套接字s将维护一个客户连接请求队列,该队列最多容纳backlog个客户连接请求。假如该函数执行成功,则返回0;如果执行失败,则返回SOCKET_ERROR。

展开阅读全文
部分上传会员的收益排行 01、路***(¥15400+),02、曲****(¥15300+),
03、wei****016(¥13200+),04、大***流(¥12600+),
05、Fis****915(¥4200+),06、h****i(¥4100+),
07、Q**(¥3400+),08、自******点(¥2400+),
09、h*****x(¥1400+),10、c****e(¥1100+),
11、be*****ha(¥800+),12、13********8(¥800+)。
相似文档                                   自信AI助手自信AI助手
搜索标签

当前位置:首页 > 环境建筑 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服