Windows+网络编程技术(十三)Windows_网络编程技术(十.pdf
-
资源ID:70014813
资源大小:883.22KB
全文页数:23页
- 资源格式: PDF
下载积分:15金币
快捷下载
会员登录下载
微信登录下载
三方登录下载:
微信扫一扫登录
友情提示
2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
|
Windows+网络编程技术(十三)Windows_网络编程技术(十.pdf
下载第13章 原始套接字利用“原始套接字”(Raw Socket),我们可访问位于基层的传输协议。本章专门讲解如何运用这种原始套接字,来模拟 I P的一些实用工具,比如 Tr a c e r o u t e和P i n g程序等等。使用原始套接字,亦可对 I P头信息进行实际的操作。本章只关心 I P协议;至于如何针对其他协议使用原始套接字,我们不打算提及。而且,大多数协议(除 AT M以外)根本就不支持原始套接字。所有原始套接字都是使用 S O C K _ R AW这个套接字类型来创建的,而且目前只有 Wi n s o c k2提供了对它的支持。因此,无论 Microsoft Windows CE还是老版本的 Windows 95(无Winsock 2升级)均不能利用原始套接字的能力。此外,要想顺利使用原始套接字,要求对基层的协议结构有一定程度的认识,而那已超出了本书的范围。在这一章中,我们打算讨论 I n t e r n e t控制消息协议(I C M P)、I n t e r n e t组管理协议(I G M P)以及用户数据报协议(U D P)。I C M P会由P i n g这个实用程序用到,以便探测到某个主机的路由是否有效和畅通,看看对方的机器是否会作出响应。对程序开发者来说,经常都要用到一种程序化的方法,以便判断一台机器是否“活动”,网络数据能否抵达它。I P多播通信利用I G M P将多播组成员信息通告给路由器。大多数 Wi n 3 2平台目前都增加了对 I G M P第2版的支持。但在某些情况下,我们也需要送出自己的 I G M P数据包,以便脱离组成员关系。至于U D P协议,我们打算把它同 I P _ H D R I N C L这个套接字选项组合起来讨论。以它为例,讲述如何发送自己的I G M P包。对这三种协议来说,我们都只会讲解与本章示范代码及示范程序密切相关的那些部分。13.1 原始套接字的创建要想使用原始套接字,第一步便是创建它。可用 s o c k e t命令或W S A S o c k e t调用来做到这一点。注意在典型情况下,在 Wi n s o c k为I P列出的目录中,并不存在 S O C K _ R AW这一套接字类型。然而,这并不能妨碍我们创建此种类型的套接字。它的意思只是说,我们不能用一个W S A P R O TO C O L _ I N F O结构来创建一个原始套接字。请参考第 5章,那里详细讲述了如何用W S A E n u m P r o t o c o l s函数以及W S A P R O TO C O L _ I N F O结构来列举协议条目。注意在套接字的创建过程中,必须自行设定 S O C K _ R AW标志。下述代码片断解释了如何将 I C M P作为一种基层I P协议,来完成一个原始套接字的创建:由于原始套接字使人们能对基层传输机制加以控制,所以有些人将其用于不法用途,从第13章计原始套接字计计341下载而造成了Windows NT下一个潜在的安全漏洞。因此,只有属于“管理员”(A d m i n i s t r a t o r s)组的成员,才有权创建类型为 S O C K _ R AW的套接字。而Windows 95和Windows 98均未施加这方面的限制。要想在Windows NT中绕过这一限制,可考虑禁止对原始套接字的安全检查。方法是在注册表创建如下变量,并将它的值设为 1(D W O R D类型):更改了注册表后,注意重新启动计算机。在上述示范代码中,我们采用的是 I C M P协议。但假如想使用 I G M P、U D P、I P或者原始I P,只需分别设置I P P R O TO _ I G M P、I P P R O TO _ U D P、I P P R O TO _ I P或者I P P R O TO _ R AW即可。然而,请注意其中存在的一处限制:在 Windows NT 4、Windows 98以及Windows 95(安装Winsock 2)操作系统中,创建原始套接字时,只能使用I G M P和I C M P。协议标志I P P R O TO _ U D P、I P P R O TO _ I P以及I P P R O TO _ R AW均要求使用套接字选项I P _ H D R I N C L,而该选项在上述平台下都是不支持的。然而,Windows 2000确实提供了对I P _ H D R I N C L选项的支持,所以能够处理 I P头(I P P R O TO _ R AW)、T C P头(I P P R O TO _ T C P)以及 U D P头(I P P R O TO _ U D P)。采用恰当的协议标志,完成了原始套接字的创建之后,接下来的事情便是在发送及接收调用中,使用对应的套接字句柄。创建原始套接字时,I P头会包含在接收到的任何返回数据中,无论是否设定了I P _ H D R I N C L选项。13.2 Internet控制消息协议I n t e r n e t控制消息协议(I C M P)是便于不同主机间传递简短消息的一种机制。大多数I C M P消息都牵涉到主机间通信时发生的一些错误;而其他 I C M P消息用于对主机进行查询。I C M P协议采用的是I P定址机制,因为它本身就是封装在 I P数据报内的一种协议。在图1 3-1中,我们展示了I C M P消息的各个字段。整条I C M P消息封装在一个I P头内。图13-1 ICMP头其中,第一个字段指定的是 I C M P消息类型,可分为查询或错误两类。随后,“代码”字段进一步定义了查询或消息的类型。而“校验和”字段的长度为 1 6位,是对I C M P头内容的一个补余求和。最后,I C M P的实际内容要依赖于前面设定的 I C M P类型及代码。在表 1 3-1中,我们对那些类型及代码进行了详细总结。若生成的是一条I C M P错误消息,那么在消息中,肯定包含了导致那个 I C M P错误的I P头,以及I P数据报的头8个字节。这样一来,收到 I C M P错误的主机便可将消息与一种特定的协议联系起来。并可根据实际情况,对那个错误作出处理。就我们目前的情况来说,P i n g需要依赖于回应请求及回应答复这两种 I C M P查询,而不是仅仅依赖一条错误消息。生成 I C M P消息的主机会通过T C P或U D P,对问题作出响应;除此之外,I C M P的用处并不大。在下一节里,8位ICMP类型8位ICMP代码ICMP具体内容(取决于类型和代码)16位ICMP检验和我们打算讨论如何随原始套接字一道,用 I C M P协议来生成一个P i n g请求,P i n g请求是用来回应请求和回应答复消息的。表13-1 ICMP消息类型类型查询错误(错误类型)代码说明0查询0回应答复(Echo Reply)3错误:目标不可抵达0网络访问不到1主机访问不到2协议访问不到3端口访问不到4数据包需要分段(分解),但却没有设置分段位5源路由失效6目标网络未知7目标主机未知8源主机独立(作废)9目标网络管理性禁止1 0目标主机管理性禁止11针对特定的TO S(服务类型),网络不可抵达1 2针对特定的TO S(服务类型),主机不可抵达1 3由于过滤,通信被管理性地禁止1 4违反主机优先级设定1 5优先级失效4错误0源主机停止工作5错误:重定向0为网络重定向1为主机重定向2和TO S和网络重定向3和TO S和主机重定向8查询0回应请求(Echo Request)9查询0路由器广告1 0查询0路由器请求11错误:超时0传输过程中T T L的值变成01重新组合时T T L的值变成01 2错误:参数问题0I P头损坏1必需的选项丢失1 3查询0时间戳请求1 4查询0时间戳答复1 5查询0信息请求1 6查询0信息答复1 7查询0地址掩码请求1 8查询0地址掩码答复13.2.1 Ping示例我们经常用P i n g来判断一个特定的主机是否处于活动状态,并且是否可以通过网络访问到。通过生成一个 I C M P“回应请求”(Echo Request),并将其定向至打算查询的目标主机,便可知道自己是否能成功地访问到那台机器。当然,这样做并不能担保一个套接字客户机能与那个主机上的某个进程顺利地建立连接(例如,远程服务器上的一个进程也许并没有进入监听模式)。若P i n g成功,那么它只能证明一件事情:远程主机的网络层可对网络事件作出响342计计第二部分附Winsock API下载应!概括地说,我们的这个P i n g示例需要采取下面这些步骤:1)创建类型为S O C K _ R AW的一个套接字,同时设定协议I P P R O TO _ I C M P。2)创建并初始化I C M P头。3)调用s e n d t o或W S A S e n d t o,将I C M P请求发给远程主机。4)调用r e c v f r o m或W S A R e c v f r o m,以接收任何I C M P响应。发出I C M P回应请求以后,远程机器会拦截这个请求,然后生成一条回应答复消息,再通过网络传回给我们。假如出于某些方面的原因,不能抵达目标主机,就会生成对应的 I C M P错误消息(比如“目标主机访问不到”),由原先打算建立通信的那个路径上某处的一个路由器返回。假定与远程主机的物理性连接并不存在问题,但远程主机已经关机或没有设置对网络事件作出响应,便需由自己的程序来执行超时检定,来侦测出这样的情况。程序清单1 3-1列出的P i n g.c示例向大家清晰展示了如何创建一个特殊的套接字,以便实现 I C M P包的收发;以及如何通过I P _ O P T I O N S套接字选项,来实现记录路由选项。程序清单13-1 Ping.c第13章计原始套接字计计343下载344计计第二部分附Winsock API下载第13章计原始套接字计计345下载346计计第二部分附Winsock API下载第13章计原始套接字计计347下载348计计第二部分附Winsock API下载第13章计原始套接字计计349下载350计计第二部分附Winsock API下载对这个P i n g示范程序来说,它最引人注目的一个特点便是采用了 I P _ O P T I O N S套接字选项。之所以要使用记录路由 I P选项,是由于这样一来,当我们的 I C M P包抵达路由器时,它的 I P地址便能自动添加到 I P选项头内具体插入位置则取决于事先在 I P选项头内设好的偏移量字段。每次遇到一个路由器向其中加入自己的 I P地址时,这个偏移距离都会自动递增 4。之所以是“4”,而不是其他数字,是由于对 I P v 4地址来说,它的长度正好是 4个字节。本书不打算对I P v 6的情况作深入探讨,目前也没有任何一种 Wi n d o w s平台提供了对它的支持。一旦收到回应答复,便可对选项头进行解析,列印出中途访问过的那些路由器的 I P地址及主机名。大家可参考第9章的内容,了解还能使用其他什么类型的 I P选项。13.2.2 Traceroute示例对I P网络来说,另一个非常有用的工具是Tr a c e r o u t e(路由追踪)。在Wi n d o w s操作系统中,一般可以直接运行Tr a c e r t.e x e,来调用这个工具。利用它,我们可侦测出为抵达网络内任何一个指定的主机,中途需经过哪些路由器,以及它们的 I P地址是什么。当然,亦可利用 P i n g,使用I P选项头内的记录路由选项,侦测中途经过的路由器 I P地址。然而,P i n g最多只支持9次“跳跃”这是在选项头内为地址分配的最大空间。一个 I P数据报需要穿越多个物理性的网络时,每通过一个路由器,我们就说进行了一次“跳跃”。若网络较大(如I n t e r n e t),穿过的路由器不止9个,便应换用Tr a c e r o u t e。Tr a c e r o u t e的设计原理是令其向目的地发送一个 U D P数据包,并重复递增I P的“存活时间”(T T L)值。最开始的时候,T T L等于1;也就是说,一旦它抵达路途中的第一个路由器,T T L首先会超时(变成 0)。这样便会造成路由器生成一个 I C M P“超时”数据包。随后,最初的T T L值递增1,以便U D P包能继续传到下一个路由器,而生成的 I C M P超时包会自第一个路由器返回。只需将返回的每一条 I C M P消息都收集下来,便能为中途经过的路由器 I P地址勾勒出一个清晰的轮廓,直到最终抵达目标主机。一旦 T T L的值递增得足够大,可以实际抵达目标位置,通常便会返回一条 I C M P“端口访问不到”消息,因为在接收端主机上,并没有进程在等待这条消息。之所以认为Tr a c e r o u t e是一个有用的工具,是由于它为我们提供了与中途经历的路由器有第13章计原始套接字计计351下载关的大量信息。进行多播通信,或者在遇到路由问题的时候,这些资料便显得非常宝贵。对具体的应用程序来说,尽管需要执行 Tr a c e r o u t e的机会比P i n g少得多,但对某些特定的任务而言,却恐怕只有Tr a c e r o u t e才能胜任。有两个办法可用来实现Tr a c e r o u t e程序。第一个办法,可使用 U D P包和发送数据报,连续递增更改T T L的值。T T L每一次“超时”,都会向我们返回一条I C M P消息。这种方法要求使用安装了U D P协议的一个套接字来发送数据,同时用安装了 I C M P协议的另一个套接字来接收数据(读取返回的消息)。这个U D P套接字本身是一个极为普通的 U D P套接字,如大家在第 7章中所见。而 I C M P套接字的类型比较特殊,是S O C K _ R AW(原始套接字),并设定了I P P R O TO _ I C M P协议。U D P套接字的T T L值需要通过I P _ T T L套接字选项加以控制。此外,也可以创建一个U D P套接字,并使用I P _ H D R I N C L选项(本章稍后还会详述),在I P头内对T T L进行人工设置。当然,这要求程序员进行更多的工作。第二个办法,我们只需将 I C M P数据包简单地发给目的地,同时连续递增更改 T T L的值。在T T L“超时”的时候,这样做也会造成一条 I C M P错误消息的返回。注意这种方法和 P i n g有着某些共通之处,它也只要求使用一个套接字(安装 I C M P协议)。在本书配套光盘的示范代码文件夹下,大家可找到一个使用了 I C M P数据包的Tr a c e r o u t e例子。本章正文并不打算列出它的完整源码,因为它的大部分代码都与前面的 P i n g例子相同。13.3 Internet组管理协议I n t e r n e t组管理协议(I G M P)由I P多播通信专用,可对多播组的成员加入或脱离组进行管理。大家可参考第11章的内容,了解如何通过 Wi n s o c k来加入及离开一个多播组。某个应用程序加入了一个多播组后,便会向本地网络的每个路由器都发出一条 I G M P消息,使用特殊地址2 2 4.0.0.2,该地址固定对应于“所有路由器”组。根据这条 I G M P消息,路由器便可知道以后发给指定多播地址的数据需要转发给这个新加入的成员。若没有这项能力,多播数据便和广播数据没什么区别了。现在来澄清一些事实。I G M P协议共有两个版本:版本1(I G M P v 1)和版本2(I G M P v 2),分别由RFC 111 2和RFC 2236文件加以定义。两者的主要区别在于:版本 1没有提供专门的方法,让一个主机指示路由器停止转发送给一个多播组的数据。换言之,若某个主机决定脱离组成员关系,便没有办法将这种情况通报给路由器,而路由器当然会坚持不懈地向其转发数据,直至在其发出一个组查询后,发现对方没有“应答”。在协议第2版中,则增加了一条能够明确表明自己要“离开”的消息。这样一来,一旦打算放弃成员资格,主机便可向路由器发出通知,使其能够立即知道这一情况。除此以外,两个版本的头格式也存在一些不同。图1 3-2展示了版本1的头结构,图1 3-3则是版本的2头结构。由于长度仅为 8字节,所以这两个头其实都非常简单。图13-2 IGMPv1头格式352计计第二部分附Winsock API下载4位IGMP版4位IGMP类型8位长度未用16位I G M P检验和32位多播地址(D类IP地址)图13-3 IGMPv2头格式其中,版本 1的头含有两个 4位字段。第一个字段指定 I G M P版本,而第二个字段指定I G M P消息类型。在版本2中,单独一个8位字段代替了这两个字段。此外,版本 1中未用的字段在新版本中派上了用场,用来指定最长的响应时间。只有在成员关系查询消息中,“最长响应时间”字段才有意义:它代表在发出一个响应报告之前,允许等候的最长时间;采用的单位是0.1秒。在其他所有消息中,发送都会将该字段设为 0,而接收者也会忽略它。对I G M P v 1来说,版本字段必然设为 1,而类型字段有两个可选的值,如表 1 3-2所示。使用主机成员资格查询(0 x 1)消息,路由器可判断一个主机正在使用哪些多播组。在这种情况下,组地址字段的值应设为 0。路由器会将查询数据包发给“所有主机”地址(2 2 4.0.0.1)。假如有主机仍是某个组的成员,那么各个主机都会将一个主机成员资格报告(I G M P消息类型0 x 2)反馈回“所有路由器”地址,同时指出自己加入的是哪个多播地址。假如一个主机是首次加入一个组,那么一条组成员资格报告消息也会发给“所有路由器”组。如表1 3-3所示,I G M P的第2版加入了两种新的消息类型版本2成员资格报告(0 x 1 6),以及离开组(0 x 1 7)消息。注意另两类消息在作用上与版本 1是相同的(主机成员资格查询和成员资格报告),尽管为其分配的值不同。然而,请注意版本 2的I G M P包已将版本及类型字段浓缩到单独一个字段里,而 0 x 11展开成二进制,便是 0 0 0 1 0 0 0 1。从表面看,完全相当于“版本等于1,类型等于1”!表13-2 IGMP版本1的消息类型类型说明0 x 1主机成员资格查询0 x 2主机成员资格报告表13-3 IGMP版本2的消息类型类型说明0 x 11成员资格查询0 x 1 2版本1成员资格报告0 x 1 6版本2成员资格报告0 x 1 7离开组版本2的成员资格查询(0 x 11)与版本1的成员资格查询差别是极其微小的。前者不仅能进行版本1那样的标准查询,也能在一个网络上,查询在一个指定的组地址中,包括了哪些组成员。具体的做法是向“所有路由器”组发送一个成员资格查询包,同时在组地址字段中指定一个打算查询的目标组。版本 2的成员资格报告则是最新设计的,因为它允许使用“最长超时”字段,对主机响应查询的时间作出限制。如超过时间仍未作出响应,便会禁止向其转发特定多播组的数据。第13章计原始套接字计计353下载8位IGMP类型8位最长响应时间32位多播地址(D类IP地址)16位IGMP检验和13.4 IP_HDRINCL的使用对原始套接字来说,它存在的一项限制在于,我们只能对已经定义好的协议进行操作,比如I G M P和I C M P等等。不能用I P P R O TO _ U D P来创建一个新的原始套接字,也不能对 U D P头进行操作;T C P也是一样的。要想对I P头进行操作,同时也能操作 T C P或U D P头(或封装在I P内的其他任何协议),必须随原始套接字一道,使用 I P _ H D R I N C L这个套接字选项。利用该选项,我们除了能自行构建I P头,亦能构建其他协议头。此外,假如想在应用程序中实现自己的协议方案,并将其封装到 I P内,那么首先可以创建一个原始套接字,然后将协议类型设为 I P P R O TO _ R AW。这样一来,我们就可在 I P头内人工设置协议字段,同时构建自己的定制协议头。在本小节内,我们打算讲述如何构建自己的U D P数据包,使大家对其中牵涉到的步骤有一个比较全面的了解。一旦理解了如何操作U D P头,再来创建自己的协议头,或对 I P内封装的其他协议进行处理,便只是“小菜一碟”。使用I P _ H D R I N C L选项时,必须针对每一次发送调用,向 I P头内自行填充内容。同时,还要填写封装在其中的其他任何协议头。I P头的结构已在第 9章进行了讲述。大家可参考图9-3,以及专门讲述 I P _ H D R I N C L选项的那一小节。与 I P相比,U D P头要简单得多。长度仅为8个字节,而且只包含了四个字段,如图 1 3-4所示。其中,头两个字段分别对应源和目标端口号,长度各自为 1 6位。第三个字段对应 U D P长度;以字节为单位,指定 U D P头以及数据的总长。第四个字段则是校验和,稍后还会对此详加解释。U D P包的最后一部分便是实际的数据。图13-4 UDP头的格式由于U D P是一种不能保证数据可靠传输的协议(即“不可靠”协议),所以校验和的计算是可选的。然而,为保持大家知识系统的完整性,在此还是要对其进行解释。与I P校验和不同,U D P校验和除覆盖了U D P头之外,还同时覆盖了实际的数据,此外还包括 I P头的一部分。而I P校验和只针对I P头进行计算。要求用于计算 U D P校验和的附加字段叫作“伪头”。一个伪头由下述项目构成:3 2位源I P地址(I P头)。3 2位目标I P地址(I P头)。8位字段(零除外)。8位协议。1 6位U D P长度。加入这些项目的是U D P头以及数据。校验和的计算方法和 I P与I C M P的方法是相同的:得出1 6位1的求余总和。由于数据可能是个奇数,所以有时需要在数据末尾填充一个 0字节,以便顺利计算出校验和。这个填充字段并不作为数据的一部分传递。在图 1 3-5中,我们向大家演示了计算校验和所需的全部字段。头三个 3 2位字构成了U D P伪头。紧接着的是 U D P头及其数据。要注意的是,由于校验和是以 1 6位值为基础计算出来的,所以或许需要用一个 0字节对数据进行填充。354计计第二部分附Winsock API下载16位源端口16位目标端口16位UDP检验和16位UDP长度图13-5 UDP伪头程序清单1 3-2列出的示范程序作用很简单,从我们选择的任何 I P及端口,它向任何指定的目标 I P及端口地址发送一个U D P数据包。第一步是创建一个原始套接字,然后设置I P _ H D R I N C L标志:注意,我们现已创建了一个协议为 I P P R O TO _ U D P的原始套接字。这种做法只适用于Windows 2000,因为它同时也要求设置 I P _ H D R I N C L选项。示范程序I p h d r i n c.c向大家阐释了如何利用原始套接字和I P _ H D R I N C L选项,操作传出去的数据包的I P与U D P头。程序清单13-2 原始U D P示例第13章计原始套接字计计355下载32位源IP地址16位UDP长度16位目标端口16位UDP检验和16位源端口16位U D P长度32位目的IP地址08位协议数据(任意字节)356计计第二部分附Winsock API下载第13章计原始套接字计计357下载358计计第二部分附Winsock API下载第13章计原始套接字计计359下载360计计第二部分附Winsock API下载第13章计原始套接字计计361下载建好套接字,并设置了 I P _ H D R I N C L选项之后,代码会开始 I P头的填写。大家可注意到,代码将I P头声明为一个结构:I P _ H D R。注意头两个4位字段已合并成单独一个字段,因为编译程序只能在最小1个字节的边界上对齐字段。正是由于这个原因,代码必须将 I P版本置于高4位。i p _ p r o t o c o l字段的值设为0 x 11,它对应于U D P。代码也将i p _ s r c a d d r字段设为源I P地址(或者想让接收者认为的任何地址),并将i p _ d e s t a d d r字段设为接收者的I P地址。网络堆栈会计算出I P校验和,所以代码中不必另行设置。下一步是对 U D P头进行初始化。这个操作是非常简单的,因为字段的数量本来就不多。设置了源和目标端口号之后,同时还要设置 U D P头的长度。校验和字段设为 0。尽管在你编写的代码中,可能并不需要进行 U D P校验和的计算,但这里的例子却那样做了,目的只是为了阐述如何用U D P“伪头”来做这件事情。为使计算简单一些,我们将所有必要的字段都复制到一个临时性的字符缓冲区内:b u f。然后,将该缓冲区传递给我们的校验和计算函数,同时指出缓冲区的长度,完成最终的计算。发出数据报之前,要做的最后一件事情是将消息的各个部分“组装”到一个邻近的缓冲区内。只需简单地使用m e m c p y函数,便可将I P、U D P头以及数据复制到一个邻近的缓冲区内。接着调用s e n d t o函数,将数据发送出去。注意在使用 I P _ H D R I N C L选项的时候,s e n d t o中的t o参数会被忽略。这是由于数据无论如何都会发送给我们在 I P头内指定的那个主机!下面来看看I p h d r i n c.c程序实际运行时的情况。此时可使用第 7章讲述的那个U D P接收者应用程序:R e c e i v e r.c。例如,可用下述参数来启动U D P接收者应用程序:如果机器只安装了一个网络接口(即只对应一个 I P地址),那么可考虑省略-i参数;否则的话,便请指定自己打算使用的那个接口的 I P地址。在Windows 2000机器中,以下述形式启动I p h d r i n c.c程序:注意,用-t i参数设定的I P地址必须是接收者正在上面监听的同样的一个 I P地址。随后,接收者应用程序应输出下述报告:结束了对 r e c v f r o m的调用之后,R e c e i v e r.c除列印出收到的消息之外,还会显示出自S O C K A D D R _ I N结构返回的地址信息,该结构已传递进入 r e c v f r o m。随后,可检验收到数据包的I P头是否与使用“M i c r o s o f t网络监视器”在网上捕捉数据包获得的结果相同。在表 1 3-4中,我们列出了I p h d r i n c示例可选的各个命令行参数。注意可自行设定源和目标的 I P地址/端口编号。表13-4 Iphdrinc.c参数参数说明-f i:x x x.x x x.x x x.x x xI P包的源I P地址-f p:整数I P包的源端口号-t i:x x x.x x x.x x x.x x xI P包的目标I P地址-t p:整数I P包的目标端口-n:整数要发送的U D P数据报的数量-m:字串要送出的消息13.5 小结原始套接字是一种强有力的机制,可供我们对基层协议进行操作。本章向大家阐述了如何通过Wi n s o c k,利用原始套接字来创建I C M P和I G M P应用程序。但要注意的是,原始套接字亦适用于其他许多应用,本章不可能全部都能讲到。要想充分发挥原始套接字以及I P _ H D R I N C L选项的功能,必须对I P协议以及I P内封装的其他所有协议有一个通盘、透彻的理解。362计计第二部分附Winsock API下载