<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="/xsl/rss.xsl" type="text/xsl" media="screen"?>
<!--åå®¢åå«æ¥å¿ï¼æ¯äºèç½ä¸ä¸ç§ä¸ªäººä¹¦ååäººéäº¤æµçå·¥å·ãéè¿åå®¢è®°å½ä¸å·¥ä½ãå­¦ä¹ ãçæ´»åå¨±ä¹çç¹æ»´ï¼çè³è§ç¹åè¯è®ºï¼ä»èå¨ç½ä¸å»ºç«ä¸ä¸ªå®å¨å±äºèªå·±çä¸ªäººå¤©å°ãå»ºç«åå®¢ï¼æå©äºä»äººå¨äºèç½ä¸æ´å¥½å°è®¤è¯æ¨ï¼ä¹æå©äºæ¨æ´å¥½çåå«äººäº¤æµãåå®¢ä¸çæ¯ä¸ä¸ªå¼æ¾åå±äº«çä¸çãæçåå®¢ç±æçå¬å¸å¼åï¼ç®åæ¯åè´¹æå¡ã--> 
<rss version="2.0" 
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:ppp="http://blog.sohu.com/ppp/"
	>

	<channel>
		<title>飞扬天下</title>
		<link>http://rise-studio.blog.sohu.com/</link>
		<description><![CDATA[如果你有一个苹果，我有一个苹果，我们交换以后还是一人一个苹果，但如果你有一种思想，我有一种思想，我们交换以后，每个人便拥有了两种思想。]]></description>
		<pubDate>Mon, 6 Mar 2006 11:56:03 +0800</pubDate>
		<ppp:ebi>f3a3f83792</ppp:ebi>
		<generator>搜狐博客</generator>
		<image>
			<title>http://blog.sohu.com</title>
			<url>http://js.pp.sohu.com/ppp/blog/images/common/logo_150_60.gif</url>
			<link>http://blog.sohu.com/</link>
			<width>100</width>
			<height>43</height>
			<description>搜狐博客</description>
		</image>
		<item>
			<title>茶叶品鉴之葵花宝典</title>
			<link>http://rise-studio.blog.sohu.com/3115683.html</link>
			<comments>http://rise-studio.blog.sohu.com/3115683.html#comment</comments>
			<dc:creator>飞扬天下</dc:creator>
			<pubDate>Mon, 15 May 2006 15:36:14 +0800</pubDate>
			<guid>http://rise-studio.blog.sohu.com/3115683.html</guid>
			<description><![CDATA[<p>品鉴茗茶可分为四个步骤、系列：<br />&nbsp;&nbsp;&nbsp;&nbsp;品茗最关键的一环便是开汤品赏，也就是将茶叶先行冲泡，然后再进行品评，品赏的一般程序为：欣赏汤色&mdash;&mdash;闻嗅香气&mdash;&mdash;尝试味道&mdash;&mdash;评看叶底。</p><p>一、欣赏汤色<br />&nbsp;&nbsp;&nbsp;&nbsp;由于茶汤中的茶多酚与空气接触会很快氧化，以致茶汤容易变色，因而要及时欣赏汤色，主要从色度、亮度、清浊度等方面，辨别茶汤颜色深浅、正常与否、茶汤暗明、清澈或浑浊程度。茶叶汤色常用的品茶术语有：<br />绿艳：清澈鲜艳，浅绿鲜亮。<br />黄绿：绿中微黄，似半成熟的橙子色泽，故又称橙绿。<br />绿黄：绿中黄多的汤色。<br />浅黄：汤色黄而浅，亦称淡黄色。<br />橙黄：汤色黄中微带红，似橙色或桔黄色。<br />橙色：汤红中带黄，似桔红色。<br />深黄：暗黄，汤黄而深无光泽。<br />青暗：汤色泛青，无光泽。<br />混暗：汤色混而暗，与&ldquo;混浊&rdquo;同义，汤中沉淀物多，混而不清，难见碗底。<br />红汤：常见于陈茶火烘焙过头的茶，其汤色有浅红色或暗红色。<br />清黄：茶汤黄而清澈。<br />金黄：茶汤清澈，以黄为主，带有橙色。<br />红艳：似琥珀色而镶金边的汤色，是高级红茶之汤色。<br />红亮、红明：汤色不甚浓，但红而透明有光彩，称为&ldquo;红亮&rdquo;；透明而略少光彩者，称为&ldquo;红明&rdquo;。<br />深红、深浓：红而深，缺乏鲜明光彩。<br />红淡：汤色红而浅淡。<br />深暗：汤色深而暗，略呈黑色，又称红暗。红茶发酵过度，贮存过久，品质陈化常有此色。<br />红浊：搪塞不论深或浅，内中沉淀物多混浊不以见底。<br />冷后浑、乳凝：红茶汤浓，冷却后出现浅褐色或橙色乳状的浑汤现象，称为冷后浑或乳凝，品质好的红茶出现这种现象。<br />姜黄：红碎茶茶汤加牛奶后，汤色呈姜黄明亮，浓厚丰满，是一种汤质浓、品质好的标志。<br />浓亮：茶汤浓而透明，虽不如浓艳光圈亮，但还有光彩。<br />鲜明：新鲜明亮，略有光泽，不够浓，但亦不淡。<br />清澈、明亮：茶汤清净透明称为&ldquo;明亮&rdquo;。明亮而有光泽，一眼见底，无沉淀或悬浮物，称为&ldquo;清澈&rdquo;。<br />明净：汤中物质欠丰富，但尚清明。<br />混浊：茶汤中有大量悬浮物，透明度差，难见碗底。<br />昏暗：汤色不明亮，但无悬浮物，与混浊略有差别。</p><p>二、闻嗅香气<br />&nbsp;&nbsp;&nbsp;&nbsp;如果采用杯泡，茶汤倒出后，一手握杯，一手掀杯盖，半开半掩，靠近杯沿用鼻轻嗅或深嗅，反复闻嗅，但每次嗅的时间不宜过长，一般掌握在三秒钟左右，以免影响嗅觉灵敏感。杯盖不要离杯，每次绣过后随即盖上，避免杯中香气飘散，以便反复闻嗅鉴别、欣赏香气。<br />&nbsp;&nbsp;&nbsp;&nbsp;鉴赏茶叶香气的因子，通常包括纯度、高低、长短等。常用的品香术语有：<br />鲜浓：香气浓而鲜爽持久。<br />鲜嫩：香气高洁细腻，新鲜悦鼻。<br />浓烈：香气丰满而持久，具有强烈的刺激性。<br />清高：清香高爽，久留鼻尖，采茶叶较嫩、新鲜、制工好的一种香气。<br />清香：香气清纯柔和，香虽不高，缓缓散发，令人有愉快感。<br />幽香：幽雅而有文气，缓慢而持久，如兰花香、花粉香或近似花的香气，但又不能具体指示哪种花香的可用幽香表示。<br />岩韵、音韵：指在香味方面具有特殊品种香味特征。岩韵适用于武夷岩茶，音韵适用于铁观音茶。<br />浓郁、馥郁：带有浓郁持久的特殊花香，称为&ldquo;浓郁&rdquo;；比浓郁香气更雅的，称为&ldquo;馥郁&rdquo;。<br />鲜爽：香气新鲜、活泼、嗅后爽快。<br />高甜：表示想起入鼻，充沛而有活力，并且伴随着带糖的甜美。<br />鲜甜：鲜爽带有甜香。功夫红茶带有此种香气，与&ldquo;鲜纯&rdquo;同义。<br />甜纯：香气不太高，但有甜感，与&ldquo;甜和&rdquo;同义。<br />高香：香高而持久，高山茶或秋冬干燥季节的茶常有高香且细腻的香气。<br />强烈：香感强烈，浓郁持久，且有充沛的活力，高档红碎茶具有这种香气。<br />浓、鲜浓：香气饱满，但无鲜爽特点称为&ldquo;浓&rdquo;；兼有鲜爽与浓的香气，称为&ldquo;鲜浓&rdquo;<br />花果香：类似各种新鲜花果的香气，多在秋冬季节，制作优良才有此香。<br />纯正：香气纯净而不高不低，无异杂气味，也为&ldquo;纯和&rdquo;。<br />平正、平淡：香气稀薄，但无粗老气或杂气，也为&ldquo;平和&rdquo;。<br />钝浊：气味虽有一定浓度，但滞钝，感觉不快。<br />粗淡：香气低，有老茶的粗糙气，也称粗老气。<br />低微：香气低，但无粗气。<br />青气、老青气：似鲜叶的青臭气味。<br />浊气：夹有其他气息，有沉浊不爽之感。<br />高火：干燥温度较高且时间过长，干度十分充足所产生的高火气。<br />老火、焦气：制茶中火温或*作不当所致，轻微的焦茶气息，称&ldquo;老火&rdquo;；严重的，称为&ldquo;焦气&rdquo;。<br />闷气：不愉快，熟闷气。<br />异气：焦、烟、馊、酸、琛、霉、油气、铁腥气、木气以及他劣质气味。</p><p>三、尝试味道<br />&nbsp;&nbsp;&nbsp;&nbsp;茶汤吮入口内，不咽下喉，用舌尖打转两三次，巡回吞吐，斟酌茶的味道，主要鉴赏浓淡、强弱、鲜爽、醇和、纯正等，常用术语有：<br />浓强：茶汤入口浓厚，有黏舌紧口感觉，刺激性强，具有鲜爽感和收敛性。<br />鲜浓：鲜快爽适，浓厚而富刺激性。<br />甜浓：新鲜、甜厚。<br />鲜爽、鲜甜：汤味新鲜，如后爽适，且有甜感，也为&ldquo;甜爽&rdquo;。<br />回甘：汤茶入口，先微苦后回甜，收敛性强。<br />浓厚、浓醇：茶汤溶质丰富，味浓而不涩，纯而不淡，浓醇适口，回味清甘。<br />醇厚：汤味尚浓，带刺激性，有活力，回味爽而略甜。<br />醇和：汤味欠浓，鲜味不足，但无粗杂味。<br />纯正：滋味较淡但属正常，缺乏鲜爽，也为&ldquo;纯和&rdquo;。<br />软弱：味淡薄软，无活力，收敛性微弱。<br />平淡：味清淡但正常，尚适口，无杂异粗老味。<br />粗淡：味淡薄滞钝，喉味粗糙，为低级茶或老梗茶的滋味。<br />苦涩：味虽浓但不鲜不醇，茶汤入口，味觉麻木，如食生柿，也为&ldquo;青涩&rdquo;。<br />水味：干茶受潮，或干度不足带&ldquo;水味&rdquo;，清淡不纯。<br />异味：焦、烟、馊、酸等劣质气味。</p><p>四、评看叶底<br />&nbsp;&nbsp;&nbsp;&nbsp;将泡过的茶叶倒入叶底盘或杯盖中，并将叶底拌匀铺开，观察其嫩度、匀度、色泽等。也可将泡过的茶叶倒入漂盘中，将清水漂叶进行观察，常用的术语有：<br />细嫩；芽头多，叶子长而细小，叶质优嫩柔软。<br />鲜嫩：叶质细嫩，叶色鲜艳明亮。<br />匀嫩：叶质细嫩匀齐一致，柔软，色泽调和。<br />柔嫩、柔软：芽叶细嫩、叶质柔软，光泽好，手指抚之如锦。<br />肥厚：芽叶肥壮、叶肉厚，质软，叶脉隐现。<br />瘦薄、飘薄：芽小叶薄，瘦薄无肉，质硬，叶脉显现。<br />粗老：叶质粗大，叶质硬，叶脉隆起，手指按之粗糙。<br />匀齐：&ldquo;匀&rdquo;是色泽调和；&ldquo;齐&rdquo;是老嫩一致，匀正无断碎。<br />单张：脱茎的独瓣叶子，也为&ldquo;单瓣&rdquo;。<br />短碎：毛茶经精制大都断成半叶，短碎是指比半叶更碎小的碎叶，也为&ldquo;破碎&rdquo;。<br />开展、摊张：冲泡后，卷紧的干茶吸水膨胀而展开片形，且有柔软感的为&ldquo;开展&rdquo;；老叶摊开为&ldquo;摊张&rdquo;。<br />卷缩：冲泡后，叶底不开展，仍卷缩成条形。<br />硬杂：叶质粗老而驳杂。<br />焦斑、焦条：叶张边缘或叶面有局部或全部黑色或黄色烧伤斑痕。局部的为&ldquo;焦斑&rdquo;，全部烧坏为&ldquo;焦条&rdquo;。<br />枯暗：叶色暗沉无光，陈茶叶底多数如此。</p>]]></description>
		</item>
		    
		
		<item>
			<title>ping的源代码</title>
			<link>http://rise-studio.blog.sohu.com/3055374.html</link>
			<comments>http://rise-studio.blog.sohu.com/3055374.html#comment</comments>
			<dc:creator>飞扬天下</dc:creator>
			<pubDate>Sat, 13 May 2006 17:20:44 +0800</pubDate>
			<category>Win32学习</category>
			<guid>http://rise-studio.blog.sohu.com/3055374.html</guid>
			<description><![CDATA[<span><span style="FONT-SIZE: 10pt"><span>// Module Name: Ping.c<br />//<br />// Code by Rise<br />//<br />// Command Line Options/Parameters:<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Ping [host] [packet-size]<br />//<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;host&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String name of host to ping<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;packet-size&nbsp;&nbsp;&nbsp;&nbsp;Integer size of packet to send (smaller than 1024 bytes)<br />//<br />//#pragma pack(1)<br /><br />#define WIN32_LEAN_AND_MEAN<br />#include &lt;winsock2.h&gt;<br />#include &lt;ws2tcpip.h&gt;<br />#include &lt;stdio.h&gt;<br />#include &lt;stdlib.h&gt;<br /><br />#define IP_RECORD_ROUTE 0x7<br />//<br />// IP header structure<br />//<br />typedef struct _iphdr<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned int&nbsp;&nbsp;&nbsp;&nbsp;h_len:4;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Length of the header<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned int&nbsp;&nbsp;&nbsp;&nbsp;version:4;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Version of IP<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned char&nbsp;&nbsp;&nbsp;&nbsp; tos;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Type of service<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned short&nbsp;&nbsp;&nbsp;&nbsp;total_len;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Total length of the packet<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned short&nbsp;&nbsp;&nbsp;&nbsp;ident;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Unique identifier<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned short&nbsp;&nbsp;&nbsp;&nbsp;frag_and_flags;&nbsp;&nbsp;&nbsp;&nbsp;// Flags<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned short&nbsp;&nbsp;&nbsp;&nbsp;ttl;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Time to live<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned short&nbsp;&nbsp;&nbsp;&nbsp;proto;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Protocol (TCP, UDP, etc.)<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned short&nbsp;&nbsp;&nbsp;&nbsp;checksum;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// IP checksum<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sourceIP;<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;destIP;<br />}IpHeader;<br /><br />#define ICMP_ECHO&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8<br />#define ICMP_ECHOREPLY&nbsp;&nbsp;&nbsp;&nbsp;0<br />#define ICMP_MIN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8&nbsp;&nbsp;&nbsp;&nbsp;// Minimun 8-byte ICMP packet (header)<br /><br />//<br />// ICMP header structure<br />//<br />typedef struct _icmphdr<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;BYTE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i_type;<br />&nbsp;&nbsp;&nbsp;&nbsp;BYTE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i_code;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Type sub code<br />&nbsp;&nbsp;&nbsp;&nbsp;USHORT&nbsp;&nbsp;&nbsp;&nbsp;i_cksum;<br />&nbsp;&nbsp;&nbsp;&nbsp;USHORT&nbsp;&nbsp;&nbsp;&nbsp;i_id;<br />&nbsp;&nbsp;&nbsp;&nbsp;USHORT&nbsp;&nbsp;&nbsp;&nbsp;i_seq;<br />&nbsp;&nbsp;&nbsp;&nbsp;// This is not the standard header, but we reserve space for time<br />&nbsp;&nbsp;&nbsp;&nbsp;ULONG timestamp;<br />}IcmpHeader;<br /><br />//<br />// IP option header -- use with socket option IP_OPTIONS<br />//<br />typedef struct _ipoptionhdr<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned char&nbsp;&nbsp;&nbsp;&nbsp;code;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Option type<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned char&nbsp;&nbsp;&nbsp;&nbsp;len;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Length of option hdr<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned char&nbsp;&nbsp;&nbsp;&nbsp;prt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Offset into options<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned long&nbsp;&nbsp;&nbsp;&nbsp;addr[9];&nbsp;&nbsp;&nbsp;&nbsp;// List of IP addrs<br />}IpOptionHeader;<br />#define DEF_PACKET_SIZE 32&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Default packet size<br />#define MAX_PACKET&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1024&nbsp;&nbsp;&nbsp;&nbsp;// Max ICMP packet size<br />#define MAX_IP_HDR_SIZE&nbsp;&nbsp;&nbsp;&nbsp;60&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Max IP header size w/options<br /><br />BOOL&nbsp;&nbsp;&nbsp;&nbsp;bRecordRoute;<br />int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;datasize;<br />char*&nbsp;&nbsp;&nbsp;&nbsp;lpdest;<br /><br />//<br />// Function: usage<br />//<br />// Description:<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Print usage information<br />//<br />void usage(char* progname)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;usage: ping -r &lt;host&gt; [data size]\n&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;&nbsp;&nbsp;&nbsp;&nbsp;-r&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;record route\n&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;&nbsp;&nbsp;&nbsp;&nbsp;host&nbsp;&nbsp;&nbsp;&nbsp;remote machine to Ping\n&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;&nbsp;&nbsp;&nbsp;&nbsp;datasize&nbsp;&nbsp;&nbsp;&nbsp;can be up to 1 KB\n&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;ExitProcess(-1);<br />}<br /><br />//<br />// Function: FillICMPData<br />//<br />// Description:<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Helper function to fill in various fields for our ICMP request<br />//<br />void FillICMPData(char* icmp_data, int datasize)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;IcmpHeader*&nbsp;&nbsp;&nbsp;&nbsp;icmp_hdr = NULL;<br />&nbsp;&nbsp;&nbsp;&nbsp;char*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;datapart = NULL;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;icmp_hdr = (IcmpHeader*)icmp_data;<br />&nbsp;&nbsp;&nbsp;&nbsp;icmp_hdr-&gt;i_type = ICMP_ECHO;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Request an ICMP echo<br />&nbsp;&nbsp;&nbsp;&nbsp;icmp_hdr-&gt;i_code = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;icmp_hdr-&gt;i_id = (USHORT)GetCurrentProcessId();<br />&nbsp;&nbsp;&nbsp;&nbsp;icmp_hdr-&gt;i_cksum = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;icmp_hdr-&gt;i_seq = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;datapart = icmp_data + sizeof(IcmpHeader);<br />&nbsp;&nbsp;&nbsp;&nbsp;//<br />&nbsp;&nbsp;&nbsp;&nbsp;// Place some junk in the buffer<br />&nbsp;&nbsp;&nbsp;&nbsp;//<br />&nbsp;&nbsp;&nbsp;&nbsp;memset(datapart, 'E', datasize - sizeof(IcmpHeader));<br />}<br /><br />//<br />// Function: checksum<br />//<br />// Description:<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;This funcion calculates the 16-bit one's complement sum<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;of the supplied buffer (ICMP)header<br />//<br />USHORT checksum(USHORT* buffer, int size)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned long cksum = 0 ;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;while(size &gt; 1)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cksum += *buffer++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size -= sizeof(USHORT);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;if(size)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cksum += *(UCHAR*)buffer;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;cksum = (cksum&gt;&gt;16)+(cksum&amp;0xffff);<br />&nbsp;&nbsp;&nbsp;&nbsp;cksum += (cksum&gt;&gt;16);<br />&nbsp;&nbsp;&nbsp;&nbsp;return (USHORT)(~cksum);<br />}<br /><br />//<br />// Function: DecodeIPOptions<br />//<br />// Description:<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If the IP option header is present. find the IP options<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;within the IP header and print the record route option<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;values<br />//<br />void DecodeIPOptions(char*buf,int bytes)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;IpOptionHeader* ipopt = NULL;<br />&nbsp;&nbsp;&nbsp;&nbsp;IN_ADDR&nbsp;&nbsp;&nbsp;&nbsp;inaddr;<br />&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp; i;<br />&nbsp;&nbsp;&nbsp;&nbsp;HOSTENT *host = NULL;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;ipopt = (IpOptionHeader*)(buf + 20);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;RR:&nbsp;&nbsp;&nbsp;&nbsp;&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i&lt;(ipopt-&gt;prt/4)-1;i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;inaddr.S_un.S_addr = ipopt-&gt;addr[i];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(i != 0 )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;&nbsp;&nbsp;&nbsp;&nbsp;&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;host = gethostbyaddr((char*)&amp;inaddr.S_un.S_addr, sizeof(inaddr.S_un.S_addr), AF_INET);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(host)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;(%-15s) %s\n&quot;, inet_ntoa(inaddr), host-&gt;h_name);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;(%-15s)\n&quot;, inet_ntoa(inaddr));<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;return;<br />}<br /><br />//<br />// Function: DecodeICMPHeader<br />//<br />// Description:<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The response is an IP packet. We must decode the IP header to locate the ICMP data.<br />//<br />void DecodeICMPHeader(char* buf, int bytes, struct sockaddr_in *from)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;IpHeader*&nbsp;&nbsp;&nbsp;&nbsp;iphdr = NULL;<br />&nbsp;&nbsp;&nbsp;&nbsp;IcmpHeader*&nbsp;&nbsp;&nbsp;&nbsp;icmphdr = NULL;<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned short iphdrlen;<br />&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tick;<br />&nbsp;&nbsp;&nbsp;&nbsp;static int&nbsp;&nbsp;&nbsp;&nbsp;icmpcount = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;iphdr = (IpHeader*)buf;<br />&nbsp;&nbsp;&nbsp;&nbsp;// Number of 32-bit words * 4 = bytes<br />&nbsp;&nbsp;&nbsp;&nbsp;iphdrlen = iphdr-&gt;h_len * 4;<br />&nbsp;&nbsp;&nbsp;&nbsp;tick = GetTickCount();<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;if((iphdrlen == MAX_IP_HDR_SIZE)&amp;&amp;(!icmpcount))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DecodeIPOptions(buf,bytes);<br />&nbsp;&nbsp;&nbsp;&nbsp;if(bytes &lt; iphdrlen + ICMP_MIN)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;Too Few bytes from %s\n&quot;,inet_ntoa(from-&gt;sin_addr));<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;icmphdr = (IcmpHeader*)(buf + iphdrlen);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;if(icmphdr-&gt;i_type != ICMP_ECHOREPLY)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;nonecho type %d recvd\n&quot;, icmphdr-&gt;i_type);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;// Make sure this is an ICMP reply to something we sent!<br />&nbsp;&nbsp;&nbsp;&nbsp;//<br />&nbsp;&nbsp;&nbsp;&nbsp;if(icmphdr-&gt;i_id != (USHORT)GetCurrentProcessId())<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;someone else's packet!\n&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;%d bytes from %s:&quot;, bytes, inet_ntoa(from-&gt;sin_addr));<br />&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot; icmp-&gt;seq = %d.&quot;, icmphdr-&gt;i_seq);<br />&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot; time: %d ms&quot;, tick-icmphdr-&gt;timestamp);<br />&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;\n&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;icmpcount++;<br />&nbsp;&nbsp;&nbsp;&nbsp;return; <br />}<br /><br />void ValidateArgs(int argc, char **argv)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;int i;<br />&nbsp;&nbsp;&nbsp;&nbsp;bRecordRoute = FALSE;<br />&nbsp;&nbsp;&nbsp;&nbsp;lpdest = NULL;<br />&nbsp;&nbsp;&nbsp;&nbsp;datasize = DEF_PACKET_SIZE;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;for(i = 1; i &lt; argc; i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if((argv[i][0] == '-')||(argv[i][0] == '/'))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;switch(tolower(argv[i][1]))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case 'r':&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Record route option<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bRecordRoute = TRUE;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;default:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;usage(argv[0]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else if(isdigit(argv[i][0]))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;datasize = atoi(argv[i]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lpdest = argv[i];<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br />//<br />// Function: main<br />//<br />// Description<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Set up the ICMP raw socket, and create the ICMP header. Add<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;the appropriate IP ooption header, and start sending ICMP<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo requests to the endpoint. For each send and receive.<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;we set a timeout value so that we don't wait forever for a<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response in case the endpoint is not responding. When we<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;receive a packet. decode it.<br />//<br />int main(int argc, char** argv)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;WSADATA&nbsp;&nbsp;&nbsp;&nbsp;wsaData;<br />&nbsp;&nbsp;&nbsp;&nbsp;SOCKET&nbsp;&nbsp;&nbsp;&nbsp;sockRaw = INVALID_SOCKET;<br />&nbsp;&nbsp;&nbsp;&nbsp;struct sockaddr_in dest, from;<br />&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bread, fromlen = sizeof(from), timeout = 1000, ret;<br />&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;&nbsp;&nbsp;&nbsp;*icmp_data = NULL, *recvbuf = NULL;<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned int addr = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;USHORT&nbsp;&nbsp;&nbsp;&nbsp;seq_no = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;struct hostent *hp = NULL;<br />&nbsp;&nbsp;&nbsp;&nbsp;IpOptionHeader ipopt;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;if(WSAStartup(MAKEWORD(2, 2), &amp;wsaData) != 0)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;WSAStartup() failed: %d\n&quot;, GetLastError());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return -1;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;ValidateArgs(argc,argv);<br />&nbsp;&nbsp;&nbsp;&nbsp;sockRaw = WSASocket(AF_INET, SOCK_RAW, IPPROTO_ICMP, NULL, 0, WSA_FLAG_OVERLAPPED);<br />&nbsp;&nbsp;&nbsp;&nbsp;if(sockRaw == INVALID_SOCKET)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;WSASocket() failed: %d\n&quot;, WSAGetLastError());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return -1;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;if(bRecordRoute)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Setup the IP option header to go out on every ICMP packet<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ZeroMemory(&amp;ipopt, sizeof(ipopt));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ipopt.code = IP_RECORD_ROUTE;&nbsp;&nbsp;&nbsp;&nbsp;// Record route option<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ipopt.prt&nbsp;&nbsp;= 4;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Point to the first addr offset<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ipopt.len&nbsp;&nbsp;= 39;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Length of option header<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret = setsockopt(sockRaw, IPPROTO_IP, IP_OPTIONS, (char*)&amp;ipopt, sizeof(ipopt));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(ret == SOCKET_ERROR)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;setsockopt(IP_OPTIONs) failed: %d\n&quot;,WSAGetLastError());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;// Set the send/recv timeout values<br />&nbsp;&nbsp;&nbsp;&nbsp;//<br />&nbsp;&nbsp;&nbsp;&nbsp;bread = setsockopt(sockRaw, SOL_SOCKET, SO_RCVTIMEO, (char*)&amp;timeout, sizeof(timeout));<br />&nbsp;&nbsp;&nbsp;&nbsp;if(bread == SOCKET_ERROR)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;setsockopt(SO_RCVTIME0)failed: %d\n&quot;, WSAGetLastError());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return -1;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;timeout = 1000;<br />&nbsp;&nbsp;&nbsp;&nbsp;bread = setsockopt(sockRaw, SOL_SOCKET, SO_SNDTIMEO, (char*)&amp;timeout, sizeof(timeout));<br />&nbsp;&nbsp;&nbsp;&nbsp;if(bread == SOCKET_ERROR)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;setsockopt(SO_SNDTIME0) failed: %d\n&quot;, WSAGetLastError());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return -1;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;memset(&amp;dest, 0, sizeof(dest));<br />&nbsp;&nbsp;&nbsp;&nbsp;//<br />&nbsp;&nbsp;&nbsp;&nbsp;// Resolve the endpoint`s name if necessary<br />&nbsp;&nbsp;&nbsp;&nbsp;//<br />&nbsp;&nbsp;&nbsp;&nbsp;dest.sin_family = AF_INET;<br />&nbsp;&nbsp;&nbsp;&nbsp;if((dest.sin_addr.s_addr = inet_addr(lpdest)) == INADDR_NONE)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if((hp = gethostbyname(lpdest)) != NULL)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memcpy(&amp;(dest.sin_addr), hp-&gt;h_addr, hp-&gt;h_length);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dest.sin_family = hp-&gt;h_addrtype;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;dest.sin_addr = %s\n&quot;, inet_ntoa(dest.sin_addr));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;gethostbyname() failed: %d\n&quot;,WSAGetLastError());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return -1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;//<br />&nbsp;&nbsp;&nbsp;&nbsp;// Create the ICMP packet<br />&nbsp;&nbsp;&nbsp;&nbsp;//<br />&nbsp;&nbsp;&nbsp;&nbsp;datasize += sizeof(IcmpHeader);<br />&nbsp;&nbsp;&nbsp;&nbsp;icmp_data = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, MAX_PACKET);<br />&nbsp;&nbsp;&nbsp;&nbsp;recvbuf = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, MAX_PACKET);<br />&nbsp;&nbsp;&nbsp;&nbsp;if(!icmp_data)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;HeapAlloc() failed: %d\n&quot;,GetLastError());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return -1;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;memset(icmp_data, 0, MAX_PACKET);<br />&nbsp;&nbsp;&nbsp;&nbsp;FillICMPData(icmp_data, datasize);<br />&nbsp;&nbsp;&nbsp;&nbsp;//<br />&nbsp;&nbsp;&nbsp;&nbsp;// Start sending/receiving ICMP packets<br />&nbsp;&nbsp;&nbsp;&nbsp;//<br />&nbsp;&nbsp;&nbsp;&nbsp;while(1)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;static int nCount = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int bwrote;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(nCount++ ==4)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((IcmpHeader*)icmp_data)-&gt;i_cksum = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((IcmpHeader*)icmp_data)-&gt;timestamp = GetTickCount();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((IcmpHeader*)icmp_data)-&gt;i_seq = seq_no++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((IcmpHeader*)icmp_data)-&gt;i_cksum = checksum((USHORT*)icmp_data, datasize, 0, (struct sockaddr*)&amp;dest, sizeof(dest));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bwrote = sendto(sockRaw, icmp_data, datasize, 0, (struct sockaddr*)&amp;dest, sizeof(dest));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(bwrote == SOCKET_ERROR)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(WSAGetLastError() == WSAETIMEDOUT)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;timed out\n&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;continue;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;recvfrom() failed: %d\n&quot;, WSAGetLastError());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return -1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(bwrote &lt; datasize)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;Wrote %d bytes\n&quot;, bwrote);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bread = recvfrom(sockRaw, recvbuf, MAX_PACKET, 0, (struct sockaddr*)&amp;from, &amp;fromlen);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(bread == SOCKET_ERROR)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(WSAGetLastError() == WSAETIMEDOUT)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;timed out\n&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;continue;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;recvfrom() failed: %d\n&quot;, WSAGetLastError());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DecodeICMPHeader(recvbuf, bread, &amp;from);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sleep(1000);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;//Cleanup<br />&nbsp;&nbsp;&nbsp;&nbsp;//<br />&nbsp;&nbsp;&nbsp;&nbsp;if(sockRaw != INVALID_SOCKET)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;closesocket(sockRaw);<br />&nbsp;&nbsp;&nbsp;&nbsp;HeapFree(GetProcessHeap(), 0, recvbuf);<br />&nbsp;&nbsp;&nbsp;&nbsp;HeapFree(GetProcessHeap(), 0, icmp_data);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;WSACleanup();<br />&nbsp;&nbsp;&nbsp;&nbsp;return 0;<br />}<br /></span></span></span>]]></description>
		</item>
		    
		
	</channel>
</rss>
