<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://mediawiki.zeropage.org/index.php?action=history&amp;feed=atom&amp;title=Gnutella-MoreFree</id>
	<title>Gnutella-MoreFree - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://mediawiki.zeropage.org/index.php?action=history&amp;feed=atom&amp;title=Gnutella-MoreFree"/>
	<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=Gnutella-MoreFree&amp;action=history"/>
	<updated>2026-05-15T01:37:18Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.8</generator>
	<entry>
		<id>https://mediawiki.zeropage.org/index.php?title=Gnutella-MoreFree&amp;diff=84406&amp;oldid=prev</id>
		<title>Maintenance script: Repair batch-0002 pages from live compare</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=Gnutella-MoreFree&amp;diff=84406&amp;oldid=prev"/>
		<updated>2026-03-27T00:16:03Z</updated>

		<summary type="html">&lt;p&gt;Repair batch-0002 pages from live compare&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 00:16, 27 March 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l39&quot;&gt;Line 39:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 39:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		이용하여 통신이 이루어진다.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		이용하여 통신이 이루어진다.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;*** 네트워크망 초기 진입 -&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;*** 네트워크망 초기 진입 -&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt; ~cpp &lt;/del&gt;Connection String : GNUTELLA CONNECTION/&amp;amp;lt;version&amp;amp;gt;/nn&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;code&amp;gt;&lt;/ins&gt;Connection String : GNUTELLA CONNECTION/&amp;amp;lt;version&amp;amp;gt;/nn&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;/code&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt; ~cpp &lt;/del&gt;Response Connection : GNUTELLA OKnn&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;code&amp;gt;&lt;/ins&gt;Response Connection : GNUTELLA OKnn&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;/code&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;*** Note  &lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;*** Note  &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		Note 1 : 모든 데이터 필드는 특별한 말이 없으면 리틀 엔디언&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		Note 1 : 모든 데이터 필드는 특별한 말이 없으면 리틀 엔디언&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l56&quot;&gt;Line 56:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 56:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			형식에 틀린 Descriptor는 폐기된다.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			형식에 틀린 Descriptor는 폐기된다.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   &lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{| class=&amp;quot;wikitable&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;quot; style=&amp;quot;width:100%;&lt;/ins&gt;&amp;quot;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| DescriptorID&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| DescriptorID&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l211&quot;&gt;Line 211:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 211:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  // Add hosts to the download list&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  // Add hosts to the download list&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  for(int i = 0; i &amp;amp;lt; Item.ResultList.size(); i++)&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  for(int i = 0; i &amp;amp;lt; Item.ResultList.size(); i++)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  Download-&amp;amp;gt;AddHost( Item.ResultList&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[&lt;/del&gt;i&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;] &lt;/del&gt;);&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  Download-&amp;amp;gt;AddHost( Item.ResultList&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;amp;#91;&lt;/ins&gt;i&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;amp;#93; &lt;/ins&gt;);&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;처럼 DownloadShell에 AddHost함수를 통해 Item의 모든 Host를 다운로드 에 넣는다.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;처럼 DownloadShell에 AddHost함수를 통해 Item의 모든 Host를 다운로드 에 넣는다.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;그러면 View 에 Download에 관한 페이지를 업데이트하고 DownloadShell의 생성자가 실행이 된다.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;그러면 View 에 Download에 관한 페이지를 업데이트하고 DownloadShell의 생성자가 실행이 된다.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l235&quot;&gt;Line 235:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 235:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  bool destroy = true;  &lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  bool destroy = true;  &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  for(int i = 0; i &amp;amp;lt; m_pShell-&amp;amp;gt;m_ChunkList.size(); i++)&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  for(int i = 0; i &amp;amp;lt; m_pShell-&amp;amp;gt;m_ChunkList.size(); i++)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  if(m_pShell-&amp;amp;gt;m_ChunkList&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[&lt;/del&gt;i&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;] &lt;/del&gt;== m_pChunk)&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  if(m_pShell-&amp;amp;gt;m_ChunkList&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;amp;#91;&lt;/ins&gt;i&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;amp;#93; &lt;/ins&gt;== m_pChunk)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  destroy = false;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  destroy = false;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   &lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l264&quot;&gt;Line 264:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 264:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  Result Item;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  Result Item;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   &lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  memcpy(&amp;amp;amp;TempX, &amp;amp;amp;Packet&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[&lt;/del&gt;NextPos&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;]&lt;/del&gt;, 4);&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  memcpy(&amp;amp;amp;TempX, &amp;amp;amp;Packet&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;amp;#91;&lt;/ins&gt;NextPos&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;amp;#93;&lt;/ins&gt;, 4);&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  Item.FileIndex = makeD( flipX(TempX));  &lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  Item.FileIndex = makeD( flipX(TempX));  &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  memcpy(&amp;amp;amp;TempX, &amp;amp;amp;Packet&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[&lt;/del&gt;NextPos + 4&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;]&lt;/del&gt;, 4);&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  memcpy(&amp;amp;amp;TempX, &amp;amp;amp;Packet&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;amp;#91;&lt;/ins&gt;NextPos + 4&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;amp;#93;&lt;/ins&gt;, 4);&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  Item.Size = makeD( flipX(TempX));&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  Item.Size = makeD( flipX(TempX));&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   &lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l282&quot;&gt;Line 282:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 282:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   &lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  Item.Origin = Log-&amp;amp;gt;Origin;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  Item.Origin = Log-&amp;amp;gt;Origin;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  memcpy(&amp;amp;amp;Item.PushID, &amp;amp;amp;Packet&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[&lt;/del&gt;Length - 16&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;]&lt;/del&gt;, 16);&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  memcpy(&amp;amp;amp;Item.PushID, &amp;amp;amp;Packet&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;amp;#91;&lt;/ins&gt;Length - 16&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;amp;#93;&lt;/ins&gt;, 16);&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  Item.Distance = Log-&amp;amp;gt;Header-&amp;amp;gt;Hops;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  Item.Distance = Log-&amp;amp;gt;Header-&amp;amp;gt;Hops;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   &lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  // Get Filename&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  // Get Filename&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  for(i = NextPos + 8; Packet&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[&lt;/del&gt;i&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;] &lt;/del&gt;!= 0; i++)&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  for(i = NextPos + 8; Packet&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;amp;#91;&lt;/ins&gt;i&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;amp;#93; &lt;/ins&gt;!= 0; i++)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  if(i &amp;amp;lt; Length - 16)&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  if(i &amp;amp;lt; Length - 16)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  Item.Name += (char) Packet&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[&lt;/del&gt;i&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;]&lt;/del&gt;;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  Item.Name += (char) Packet&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;amp;#91;&lt;/ins&gt;i&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;amp;#93;&lt;/ins&gt;;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  else&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  else&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  break;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  break;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   &lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  // Pass any data between double null&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  // Pass any data between double null&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  while(Packet&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[&lt;/del&gt;++i&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;] &lt;/del&gt;!= 0)&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  while(Packet&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;amp;#91;&lt;/ins&gt;++i&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;amp;#93; &lt;/ins&gt;!= 0)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  if(i &amp;amp;gt; Length - 16)&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  if(i &amp;amp;gt; Length - 16)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  break;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  break;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l342&quot;&gt;Line 342:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 342:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== 참고 링크 ==&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== 참고 링크 ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [http://www.0bin.net/moniwiki/wiki.php/Specification/gnutella_protocol] : 정리 문서&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [http://www.0bin.net/moniwiki/wiki.php/Specification/gnutella_protocol] : 정리 문서&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.zeropage.org/index.php?title=Gnutella-MoreFree&amp;diff=31983&amp;oldid=prev</id>
		<title>imported&gt;rabierre at 17:30, 30 January 2013</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=Gnutella-MoreFree&amp;diff=31983&amp;oldid=prev"/>
		<updated>2013-01-30T17:30:47Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;__TOC__&lt;br /&gt;
파일 공유 프로토콜인 Gnutella 에 대한 분석글&lt;br /&gt;
----&lt;br /&gt;
= Gnutella-More Free =&lt;br /&gt;
&lt;br /&gt;
== 시작에 앞서서 ==&lt;br /&gt;
늦게 이 글을 올린 것에 대해 미안하다.&lt;br /&gt;
이 문서는 내가 아르바이트를 하면서 번역과 작성한 문서이다.&lt;br /&gt;
지금의 스펙에서는 라우팅 부분의 맴과 캐쉬와 쉐어에서 많은 부분 수정이 가해졌다.&lt;br /&gt;
대부분의 P2P 프로그램들이 누텔라의 방법을 기본으로 작성 되었으며 지금의 유동적&lt;br /&gt;
IP를 갖는 환경에서는 이를 뛰어 넘는 방법은 없을 것으로 보여진다. &lt;br /&gt;
후에 IPv6가 나온다면 각각의 시스템이 아닌 어플리케이션에 IP를 붙일 수 있게 되어진다고&lt;br /&gt;
읽은 적이 있다. 이 때 되면 보다 획기적인 P2P 프로그램이 나올 것으로 보인다.&lt;br /&gt;
&lt;br /&gt;
아래의 글은 가볍게 읽어 주시길....&lt;br /&gt;
&lt;br /&gt;
== 주인장이 생각하는 가장 이상적인 P2P란 ==&lt;br /&gt;
그누텔라는 확실히 매력적이고 또한 이상적인 순수 P2P라는 생각이 든다. 하지만 P2P란 많은 부분&lt;br /&gt;
희생(?)이 필요하다. 여기서 희생이란 불필요하지만 쓸 수 밖이 없는 대역폭을 말한다. &lt;br /&gt;
내가 찾고자 하는 파일이 누가 가지고 있는 지 알고 있다면 굳이 P2P는 필요하지 않을 것이다.&lt;br /&gt;
&lt;br /&gt;
하지만 이러한 희생을 줄이는 것이 보다 좋을 것이라는 생각이 든다. 그런 점에서 내가 생각하는 가장&lt;br /&gt;
이상적인 P2P는 e-Donkey라고 생각 되어진다. 물론 지금의 e-Donkey는 아니다. 내가 생각하는 부분으로&lt;br /&gt;
고쳐져야 겠지. 하지만 지금의 e-Donkey처럼 개인이 서버를 가질 수 있고 또한 이 서버를 가지고 찾는&lt;br /&gt;
다면 불필요한 대역폭은 줄어들 것이고 분산된 서버를 하나의 순수 P2P로 묶고 서버에서 클라이언트의&lt;br /&gt;
노드들을 수정해 준다면 가장 이상적이지 않을까? 라고 한 때 무신히 고민했다. 잡소리 이제 그만!!!!&lt;br /&gt;
&lt;br /&gt;
== The Gnutella Protocol Document ==&lt;br /&gt;
&lt;br /&gt;
The Gnutella Protocol Document&lt;br /&gt;
&lt;br /&gt;
# Protocol Specification&lt;br /&gt;
&lt;br /&gt;
	1.1 Gnutella란 Peer to Peer 의 분산 모델로서 Mesh구조의 네트워크망을 가지며 &lt;br /&gt;
		Query전송을 통해 네트워크내 파일의 검색과 다운로드를 가능하게 한다.&lt;br /&gt;
&lt;br /&gt;
	1.2 프로토콜 정의&lt;br /&gt;
		5개의 Descriptor를 사용하고 TCP/IP 프로토콜과 ASCII Code를 기반으로&lt;br /&gt;
		이용하여 통신이 이루어진다.&lt;br /&gt;
*** 네트워크망 초기 진입 -&lt;br /&gt;
 ~cpp Connection String : GNUTELLA CONNECTION/&amp;amp;lt;version&amp;amp;gt;/nn&lt;br /&gt;
 ~cpp Response Connection : GNUTELLA OKnn&lt;br /&gt;
*** Note &lt;br /&gt;
		Note 1 : 모든 데이터 필드는 특별한 말이 없으면 리틀 엔디언&lt;br /&gt;
		Note 2 : IP 주소는 IPv4 형식으로 쓰인다. &lt;br /&gt;
		Note 3 : Protocol은 Header와 Payload로 구성&lt;br /&gt;
*** 헤더&lt;br /&gt;
		Descriptor ID (16 byte): 네트워크 상의 고유 식별자&lt;br /&gt;
		Payload Descriptor (2 byte): 명령어의 식별자&lt;br /&gt;
		TTL (1 byte): 네트워크의 Servent를 지날 때마다 감소하는 수 / &lt;br /&gt;
		       네트워크 부하를 줄이기 위해 쓰임&lt;br /&gt;
		Hops (1 byte): 지나간 Servent수 &lt;br /&gt;
		Payload Length (4 byte): Header 다음에 따라오는 Descriptor 의 길이 &lt;br /&gt;
			Data가 스트림이기 때문에 공백이나 Pad Byte가 따라오지않는다.&lt;br /&gt;
	   	Gnutella 프로토콜의 경우 synch를 맞추는 특별한 byte가 존재하지 않아&lt;br /&gt;
			형식에 틀린 Descriptor는 폐기된다.&lt;br /&gt;
 &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| DescriptorID&lt;br /&gt;
| Payload Descriptor&lt;br /&gt;
| TTL&lt;br /&gt;
| hops&lt;br /&gt;
| PayloadLength&lt;br /&gt;
|}&lt;br /&gt;
		 0           15       16             17     18   19             22&lt;br /&gt;
&lt;br /&gt;
*** 디스크립터 (Descriptor)&lt;br /&gt;
		  표1)&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 색인&lt;br /&gt;
| 설명&lt;br /&gt;
|-&lt;br /&gt;
| ping&lt;br /&gt;
| 네트워크상의 호스트를 찾을 때 쓰인다. Payload가 없기 때문에 header의 Payload_Length = 0x00000000 로 설정된다.&lt;br /&gt;
|-&lt;br /&gt;
| pong&lt;br /&gt;
| Ping을 받으면 주소와 기타 정보를 포함해 응답한다.Port / IP_Address / Num Of Files Shared / Num of KB Shared** IP_Address - Big endian&lt;br /&gt;
|-&lt;br /&gt;
| query&lt;br /&gt;
| 네트워크상에서 검색에 쓰이고 검색 Minimum Speed ( 응답의 최소 속도 ), Search Criteria 검색 조건&lt;br /&gt;
|-&lt;br /&gt;
| queryHit&lt;br /&gt;
| 검색 Query 조건과 일치한 경우 QueryHit로 응답한다. Num Of Hits 조건에 일치하는 Query의 결과 수 Port / IP_Address (Big-endian) / Speed / Result Set File Index ( 파일 번호 ) File Size  ( 파일 크기 )File Name ( 파일 이  / 더블 널로 끝남 ) Servent Identifier 응답하는 Servent의 고유 식별자 Push 에 쓰인다.&lt;br /&gt;
|-&lt;br /&gt;
| push&lt;br /&gt;
| 방화벽이 설치된 Servent와의 통신을 위한 DescriptorServent Identifier / File Index / IP_Address(Big-endian)/Port&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
	 1.3 명령어 라우팅&lt;br /&gt;
### Pong 은 Ping이 왔던 같은 길을 따라 전송된다. 만약 DescriptorID가 n&lt;br /&gt;
		인 Pong을 받았는 데 Descriptor ID가 n인 Ping 보지 못했다면 Ping을 보&lt;br /&gt;
		낸 Servent는 네트워크 상에서 제거된 것을 의미한다.&lt;br /&gt;
### QueryHit와 Query -&lt;br /&gt;
### Push/QueryHit -&lt;br /&gt;
### 전달 되었던 Ping과 Query를 제외하고 모든 Ping과 Query는 연결 된 &lt;br /&gt;
		모든 Servent에 전송된다.&lt;br /&gt;
### TTL/Hop은 다른 Servent로 전송되기 전에 변경되며 후에 TTL이 &lt;br /&gt;
		0이면 다른 Servent로 전송되지 않는다.&lt;br /&gt;
### 전에 전송된 Descriptor는 다시 전송되지 않는다. 네트워크 부하 줄임&lt;br /&gt;
&lt;br /&gt;
	 1.4 파일 다운로드  &lt;br /&gt;
		QueryHit 명령어를 받으면 파일을 초기화 하고 다운로드를 시작한다.&lt;br /&gt;
		이는 Gnutella 네트워크를 이용하는 것이 아니라 기존의 HTTP 프로토콜&lt;br /&gt;
		을 이용하여 직접 파일이 전송된다.&lt;br /&gt;
		GET/get/&amp;lt;File Index&amp;gt;/&amp;lt;File Name&amp;gt;/HTTP/1.0rn&lt;br /&gt;
		Connection:Keep-Alivern&lt;br /&gt;
		Range:bytes=0-rn&lt;br /&gt;
		User-Agent:Gnutellarn3&lt;br /&gt;
		rn&lt;br /&gt;
		Range가 파일의 이어받기가 가능하게 함.&lt;br /&gt;
		&amp;lt;File Index&amp;gt;는 파일 번호이고 이는 QueryHit Result에 포함된 내용이다.&lt;br /&gt;
		이와같은 HTTP 헤더를 받으면 서버는 다음과 같은 헤더를 보내준다.&lt;br /&gt;
		HTTP 200 OKrn&lt;br /&gt;
		Server:Gnutellarn&lt;br /&gt;
		Content-type:application/binaryrn&lt;br /&gt;
		Content-length:435678rn&lt;br /&gt;
		rn&lt;br /&gt;
		바로 다음에 데이터가 Content-length만큼 따라오게 된다.&lt;br /&gt;
		&lt;br /&gt;
	 1.5 방화벽이 설치된 Servents&lt;br /&gt;
		방화벽으로 인해 직접 연결이 불가능한 경우 Push Descriptor를 보내고 라우팅을 통해 받은 &lt;br /&gt;
                  QueryHit에 대한 응답으로 새로운 TCP/IP 연결이 생긴&lt;br /&gt;
		다.&lt;br /&gt;
		새롭게 연결 된 후 &lt;br /&gt;
		GIV&amp;lt;File Index&amp;gt;:&amp;lt;Severnt Identifier&amp;gt;/&amp;lt;File Name&amp;gt;nn	를 보내 파일&lt;br /&gt;
		을 요청하면&lt;br /&gt;
		GET/get/&amp;lt;File Index&amp;gt;/&amp;lt;File Name&amp;gt;/HTTP1.0rn&lt;br /&gt;
		Connection:Keep-Alivern&lt;br /&gt;
		Range:bytes=0-rn&lt;br /&gt;
		User-Agent:Gnutellarn3&lt;br /&gt;
		rn&lt;br /&gt;
		과 같은 HTTP GET request형식으로 응답을 하며 파일을 전송한다.&lt;br /&gt;
		그러나 Push Descriptor조차 보내지 못하면 파일전송은 불가능하다.&lt;br /&gt;
&lt;br /&gt;
	 1.6 확장된 Gnutella 프로토콜&lt;br /&gt;
		기존의 Gnutella가 다른 프로그램(BearShare) 에 의해 서비스 되면서 &lt;br /&gt;
		확장된 프로토콜	이 필요하게 되었다.  이를 Triler라고 하며 QueryHit 의&lt;br /&gt;
		ResultSet 마지막 더블널 과 Servent ID사이에 들어간다.&lt;br /&gt;
*** Trailer&lt;br /&gt;
		VendorCode(3byte) OpenDataSize(1byte) OpenData(2byte) PrivateData(n)&lt;br /&gt;
&lt;br /&gt;
# Gnutella Core Code&lt;br /&gt;
	2.1 Data Structure&lt;br /&gt;
		File Name : Packet.Cpp&lt;br /&gt;
		Common 			IP / ExIP / Node / NodeEx&lt;br /&gt;
		GnutellaPacket			packet_Header / packet_Ping / packet_Pong&lt;br /&gt;
						packet_Push / packet_Query / packet_QueryHit&lt;br /&gt;
&lt;br /&gt;
	2.2 Class Hierarchal Diagram&lt;br /&gt;
&lt;br /&gt;
# Gnucleus Technical Description&lt;br /&gt;
	Gnuclues는 Gnutella 프로젝트 중 OpenSoure로 실제 인터페이스 부분이 열악하다.&lt;br /&gt;
	하지만 Gnucleus의 Core 코드 부분의 Docunment가 가장 잘 나와있고 실제로 &lt;br /&gt;
	Compile / Execute 가능한 Code를 손에 얻을 수 있는 프로그램이다. 물론 &lt;br /&gt;
	지금 상태는 버전의 호환성으로 인해 Gnucleus node에 실제 노드에 접속하는 것이&lt;br /&gt;
	어렵지만 같은 버전 사이의 접속은 가능하므로 인터페이스 부분을 수정한다면&lt;br /&gt;
	보다 좋은 프로그램으로 변형할 수 있을 것 같다.&lt;br /&gt;
	또한 Entica에서 필요로하는 Search / MultiThreadDownloader를 지원하며 &lt;br /&gt;
	또한 가장 기본적인 기능을 구현하여 불필요한 소스코드가 적다는 장점도 있다. &lt;br /&gt;
	이런 이유로 다른 몇몇 Gnutella 프로그램도 Gnucleus를 기반으로 작성 되어졌다.&lt;br /&gt;
&lt;br /&gt;
# Note&lt;br /&gt;
servent : server 와 client 의 합성어 &lt;br /&gt;
little endian byte : 작은 쪽 (바이트 열에서 가장 작은 값)이 먼저 저장되는 순서&lt;br /&gt;
descriptor : 패킷이 갖는 의미&lt;br /&gt;
payload : 패킷 갖는 데이타&lt;br /&gt;
&lt;br /&gt;
# 참고 URL&lt;br /&gt;
&lt;br /&gt;
http://www.gnucleus.com/				(Gnucleus 프로그램)&lt;br /&gt;
&lt;br /&gt;
http://www.sourceforge.net/				(Gnutella Clone 프로그램)&lt;br /&gt;
&lt;br /&gt;
http://www.gnutelladev.com/source/gnucleus0.html	(소스코드)&lt;br /&gt;
&lt;br /&gt;
CVS// http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/gnucleus/(최근의 소스코드)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 기타 코드에 관한 설명 ==&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Gnucleus에서 다운로드 받는 방법에 대한 설명 &lt;br /&gt;
 void CSearchResults::OnButtonDownload() &lt;br /&gt;
 {&lt;br /&gt;
 std::list&amp;amp;lt;ResultGroup&amp;amp;gt;::iterator itGroup;&lt;br /&gt;
 POSITION pos = m_lstResults.GetFirstSelectedItemPosition(); &lt;br /&gt;
 &lt;br /&gt;
 while(pos)&lt;br /&gt;
 {&lt;br /&gt;
 int nItem = m_lstResults.GetNextSelectedItem(pos); &lt;br /&gt;
 ResultGroup* pGroup = (ResultGroup*) m_lstResults.GetItem(nItem);&lt;br /&gt;
 &lt;br /&gt;
 if(pGroup)&lt;br /&gt;
 RelayDownload(*pGroup); &lt;br /&gt;
 }&lt;br /&gt;
 }&lt;br /&gt;
에서 다운로드 버튼을 누르면 결과 그룹중에서 pos를 기억하고 이 pos를 이용해 다운받을&lt;br /&gt;
파일을 선택하고 그 그룹의 결과값을 RelayDownload 함수의 전달인자로 보낸다.&lt;br /&gt;
 void CSearchResults::RelayDownload(ResultGroup &amp;amp;amp;Item) 에서는 &lt;br /&gt;
 CGnuDownloadShell* Download = new CGnuDownloadShell(m_pComm);&lt;br /&gt;
에서와 같이 새로운 다운로드 쉘을 만들고 &lt;br /&gt;
 m_pComm-&amp;amp;gt;m_DownloadList.push_back(Download); &lt;br /&gt;
와 같이 m_DownloadList에 Download 객체를 삽입하고 CGnuControl에서 제어하게 만든다. &lt;br /&gt;
 Download-&amp;amp;gt;m_Name = Item.Name;&lt;br /&gt;
 Download-&amp;amp;gt;m_Search = ReSearch;&lt;br /&gt;
 Download-&amp;amp;gt;m_FileLength = Item.Size;&lt;br /&gt;
 Download-&amp;amp;gt;m_AvgSpeed = Item.AvgSpeed;&lt;br /&gt;
같이 초기화를 한다.&lt;br /&gt;
 // Add hosts to the download list&lt;br /&gt;
 for(int i = 0; i &amp;amp;lt; Item.ResultList.size(); i++)&lt;br /&gt;
 Download-&amp;amp;gt;AddHost( Item.ResultList[i] );&lt;br /&gt;
처럼 DownloadShell에 AddHost함수를 통해 Item의 모든 Host를 다운로드 에 넣는다.&lt;br /&gt;
그러면 View 에 Download에 관한 페이지를 업데이트하고 DownloadShell의 생성자가 실행이 된다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
CGnuControl에서의 void CGnuControl::ManageDownloads()에 의해 제어된다. &lt;br /&gt;
void CGnuDownloadShell::Start() 로 다운로드가 시작이 되고 실제적인 다운로드는 CGnuDownload에서 이루어지면 쉘에서는 Timer()에서 CheckCompletion()로 완료 되었는 지 확인을 하게 되고 AttachChunk2Chunk 와 AttachChunk2Partial로 부분부분 완료된 Chunk들을 결합해 주는 역활을 하게 된다. &lt;br /&gt;
실제적으로 하나의 Host마다 CGnuDownload 클래스를 갖게 되며 데이타를 받는 소켓이 된다m_StartPos가 받기 시작하는 Chunk의 시작을 나타내며 ReadyFile()에서는 전의 받던 파일이 있는 지 조사후에 File을 연다. &lt;br /&gt;
StartDownload() 함수에서 다운로드를 시작하며 GetStartPos() 를 통해 Chunk가 다운로드가 시작할 m_pChunk-&amp;gt;m_StartPos의 위치를 알게 한다. &lt;br /&gt;
 m_StartPos = m_pShell-&amp;amp;gt;m_BytesCompleted + ((m_pShell-&amp;amp;gt;m_FileLength - m_pShell-&amp;amp;gt;m_BytesCompleted) / 2);&lt;br /&gt;
 m_pChunk-&amp;amp;gt;StartPos = m_StartPos;&lt;br /&gt;
 m_pChunk-&amp;amp;gt;FileLength = m_pShell-&amp;amp;gt;m_FileLength - m_StartPos; &lt;br /&gt;
공식으로 Chunk의 시작위치를 구한다. &lt;br /&gt;
SendRequest() 에서 HTTP/GET 형식으로 헤더를 보내 받고자 하는 데이타를 요청한다 &lt;br /&gt;
OnReceive(int nErrorCode) 에서 Content-length 만큼의 버퍼 데이타를 받아 청크와 연결 시킨다. &lt;br /&gt;
이어 받기를 할때에는 파일의 끝에서 -4096만큼 얻고 m_Verification 블럭의 4096크기 만큼 비교를 한 후에 이어받기를 시작한다. &lt;br /&gt;
새로운 청크를 만드는 조건은 이미 완료된 청크의 남은 부분이 EmptySize &amp;gt; 16384 보다 커야&lt;br /&gt;
한다는 것이다. &lt;br /&gt;
소스는 다음과 같고 &lt;br /&gt;
 // Reset m_pChunk because this can be called multiple times&lt;br /&gt;
 if(m_pChunk)&lt;br /&gt;
 {&lt;br /&gt;
 bool destroy = true; &lt;br /&gt;
 for(int i = 0; i &amp;amp;lt; m_pShell-&amp;amp;gt;m_ChunkList.size(); i++)&lt;br /&gt;
 if(m_pShell-&amp;amp;gt;m_ChunkList[i] == m_pChunk)&lt;br /&gt;
 destroy = false;&lt;br /&gt;
 &lt;br /&gt;
 if(destroy)&lt;br /&gt;
 delete m_pChunk;&lt;br /&gt;
 &lt;br /&gt;
 m_pChunk = NULL;&lt;br /&gt;
 }&lt;br /&gt;
부분은 소켓의 청크중에 지금의 청크가 없다면 지금 받은 청크는 끝마친 것으로 &lt;br /&gt;
생각하고 m_pChunk = NULL로 만든다&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Gnucleus에서 프로토콜 통신 &lt;br /&gt;
&lt;br /&gt;
GnuCreateGuid(&amp;amp;Guid) // DescriptorID 생성 &lt;br /&gt;
라우팅시 연결된 모든 nodeList에서 key-&amp;gt;Origin를 찾아내어 key-&amp;gt;Origin를 제외한 모든 node에 받은 pong 또는 queryHit를 전달 &lt;br /&gt;
* Search&lt;br /&gt;
 int length = 25 + m_Search.GetLength() + 1;&lt;br /&gt;
 pNode-&amp;amp;gt;SendPacket(m_Packet, length, PACKET_QUERY, true); &lt;br /&gt;
* Result Set &lt;br /&gt;
 // Extract results from the packet&lt;br /&gt;
 while(HitsLeft &amp;amp;gt; 0 &amp;amp;amp;&amp;amp;amp; NextPos &amp;amp;lt; Length - 16)&lt;br /&gt;
 { &lt;br /&gt;
 Result Item;&lt;br /&gt;
 &lt;br /&gt;
 memcpy(&amp;amp;amp;TempX, &amp;amp;amp;Packet[NextPos], 4);&lt;br /&gt;
 Item.FileIndex = makeD( flipX(TempX)); &lt;br /&gt;
 memcpy(&amp;amp;amp;TempX, &amp;amp;amp;Packet[NextPos + 4], 4);&lt;br /&gt;
 Item.Size = makeD( flipX(TempX));&lt;br /&gt;
 &lt;br /&gt;
 Item.Host = QueryHit-&amp;amp;gt;Host;&lt;br /&gt;
 Item.Port = QueryHit-&amp;amp;gt;Port;&lt;br /&gt;
 Item.Speed = makeD( flipX(QueryHit-&amp;amp;gt;Speed));&lt;br /&gt;
 &lt;br /&gt;
 Item.Firewall = Firewall;&lt;br /&gt;
 Item.Busy = Busy;&lt;br /&gt;
 Item.Stable = Stable;&lt;br /&gt;
 Item.ActualSpeed = ActualSpeed;&lt;br /&gt;
 &lt;br /&gt;
 if(ExtendedPacket)&lt;br /&gt;
 Item.Vendor = Vendor;&lt;br /&gt;
 &lt;br /&gt;
 Item.Origin = Log-&amp;amp;gt;Origin;&lt;br /&gt;
 memcpy(&amp;amp;amp;Item.PushID, &amp;amp;amp;Packet[Length - 16], 16);&lt;br /&gt;
 Item.Distance = Log-&amp;amp;gt;Header-&amp;amp;gt;Hops;&lt;br /&gt;
 &lt;br /&gt;
 // Get Filename&lt;br /&gt;
 for(i = NextPos + 8; Packet[i] != 0; i++)&lt;br /&gt;
 if(i &amp;amp;lt; Length - 16)&lt;br /&gt;
 Item.Name += (char) Packet[i];&lt;br /&gt;
 else&lt;br /&gt;
 break;&lt;br /&gt;
 &lt;br /&gt;
 // Pass any data between double null&lt;br /&gt;
 while(Packet[++i] != 0)&lt;br /&gt;
 if(i &amp;amp;gt; Length - 16)&lt;br /&gt;
 break;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 Item.NameLower = Item.Name;&lt;br /&gt;
 Item.NameLower.MakeLower();&lt;br /&gt;
 Item.Icon = m_pDoc-&amp;amp;gt;GetIconIndex(Item.NameLower);&lt;br /&gt;
 &lt;br /&gt;
 m_WholeList.push_back(Item);&lt;br /&gt;
 &lt;br /&gt;
 // Screen Item to user&amp;#039;s preferences&lt;br /&gt;
 if(Inspect(Item))&lt;br /&gt;
 {&lt;br /&gt;
 m_CurrentList.push_back(Item);&lt;br /&gt;
 m_tabResults-&amp;amp;gt;UpdateList( AddtoGroup(Item) );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 // Check for end of reply packet&lt;br /&gt;
 if(i + 1&amp;amp;gt;= Length - 16)&lt;br /&gt;
 HitsLeft = 0;&lt;br /&gt;
 else&lt;br /&gt;
 {&lt;br /&gt;
 HitsLeft--;&lt;br /&gt;
 NextPos = i + 1;&lt;br /&gt;
 }&lt;br /&gt;
 }&lt;br /&gt;
패킷의 packet_QueryHit 에서 ResultSet을 추출하여 Item Vector에 넣어준다.&lt;br /&gt;
 void CGnuNode::Recieve_Ping(packet_Ping* Ping, int nLength)&lt;br /&gt;
 key_Value* key = m_pComm-&amp;amp;gt;m_TableRouting.FindValue(&amp;amp;amp;Ping-&amp;amp;gt;Header.Guid); &lt;br /&gt;
통해 받았던 핑인지 검사하고 if(key == NULL) 받았던 핑이 아니라 새로운 핑이라면 m_pComm-&amp;gt;m_TableRouting.Insert(&amp;amp;Ping-&amp;gt;Header.Guid, this) 처럼 라우팅 테이블에 넣고 Pong을 보내준다. &lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
방화벽이 설치된 경우의 자세한 설명 &lt;br /&gt;
 UINT AttemptPort = pPrefs-&amp;amp;gt;m_ForcedPort ? pPrefs-&amp;amp;gt;m_ForcedPort : pPrefs-&amp;amp;gt;m_LocalPort;&lt;br /&gt;
 AttemptPort += rand() % 99 + 0; &lt;br /&gt;
Firewall에 있을 경우 이런 방법으로 포트를 열지 못하면 랜덤한 포트를 부여 ForcedPort로 접속 Attempts &amp;lt; 3 만큼 시도를 한다. &lt;br /&gt;
그리고 PUSH를 Route PUSH를 통해 보내 그누텔라 default 포트가 아닌 열 수 있는 포트로 직접연결을 한다. &lt;br /&gt;
만약 상대방 서버가 FireWall에 있다면 QueryHit중의 bool Firewall;필드가 True가 되므로 이에 대한 응답으로 &lt;br /&gt;
 Item.Host = QueryHit-&amp;amp;gt;Host; Item.Port = QueryHit-&amp;amp;gt;Port;&lt;br /&gt;
 에 해당하는 Port로 Download를 한다. &lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Thread ==&lt;br /&gt;
&lt;br /&gt;
== 참고 링크 ==&lt;br /&gt;
* [http://www.0bin.net/moniwiki/wiki.php/Specification/gnutella_protocol] : 정리 문서&lt;br /&gt;
&lt;/div&gt;</summary>
		<author><name>imported&gt;rabierre</name></author>
	</entry>
</feed>