E D R , A S I H C RSS

Gnutella-More Free


ŒŒณตœ  ”„๋กœ† œธ Gnutella — ๋Œ€•œ ๋ถ„„ธ€

1. Gnutella-More Free


1.1. ‹œž‘— •ž„œ„œ

๋ŠฆฒŒ ธ€„ ˜ฌ๋ฆฐ ฒƒ— ๋Œ€•ด ๋ฏธ•ˆ•˜‹ค.
ด ๋ฌธ„œ๋Š” ๋‚ดฐ€ •„๋ฅด๋ฐ”Šธ๋ฅผ •˜๋ฉด„œ ๋ฒˆ—ญณผ ž‘„•œ ๋ฌธ„œด๋‹ค.
ง€ธˆ˜ ŠคŽ™—„œ๋Š” ๋šฐŒ… ๋ถ€๋ถ„˜ ๋งดณผ บ‰ฌ™€ ‰–ด—„œ ๋งŽ€ ๋ถ€๋ถ„ ˆ˜ •ฐ€•กŒ๋‹ค.
๋Œ€๋ถ€๋ถ„˜ P2P ”„๋กœธ๋žจ๋“คด ๋ˆ„…”๋˜ ๋ฐฉ๋ฒ•„ ธฐ๋ณธœผ๋กœ ž‘„ฑ ๋˜—ˆœผ๋ฉฐ ง€ธˆ˜ œ ๋™ 
IP๋ฅผ ฐ–๋Š” ™˜ฒฝ—„œ๋Š” ด๋ฅผ ๋›ฐ–ด ๋„˜๋Š” ๋ฐฉ๋ฒ•€ —†„ ฒƒœผ๋กœ ๋ณด—ฌ„‹ค.
›„— IPv6ฐ€ ๋‚˜˜จ๋‹ค๋ฉด ฐฐ˜ ‹œŠค…œ•„‹Œ –ด”Œ๋ฆฌผ€…˜— IP๋ฅผ ๋ถ™ˆ˜ žˆฒŒ ๋˜–ด„‹ 
€  žˆ๋‹ค. ด ๋•Œ ๋˜๋ฉด ๋ณด๋‹šธฐ P2P ”„๋กœธ๋žจด ๋‚˜˜ฒƒœผ๋กœ ๋ณดธ๋‹ค.

•„๋ž˜˜ ธ€€ ฐ€๋ณฒŒ –ด ฃผ‹œธธ....

1.2. ฃผžฅƒฐ•˜๋Š” ฐ€žฅ ƒ P2P๋ž€

ธ๋ˆ„…”๋ผ๋Š” ™•‹žˆ ๋งค๋   ˜•œ ƒ ˆœˆ˜ P2Pผ๋Š” ƒฐด ๋“ ‹ค. •˜ง€๋งŒ P2P๋ž€ ๋งŽ€ ๋ถ€๋ถ„
ƒ(?)•„š”•˜‹ค. —ฌธฐ„œ ƒด๋ž€ ๋ถˆ•„š”•˜ง€๋งŒ “ธ ˆ˜ ๋ฐ–—†๋Š” ๋Œ€—ญญ„ ๋ง•œ‹ค.
๋‚ดฐ€ ฐพ ž •˜๋Š” ŒŒด ๋ˆ„ฐ€ ฐ€ง€  žˆ๋Š” ง€ •Œ  žˆ๋‹ค๋ฉด ตณP2P๋Š” •„š”•˜ง€ •Š„ ฒƒด๋‹ค.

•˜ง€๋งŒ ด๋Ÿฌ•œ ƒ„ „ด๋Š” ฒƒด ๋ณด๋‹‹„ ฒƒด๋ผ๋Š” ƒฐด ๋“ ‹ค. ธ๋Ÿฐ  —„œ ๋‚ดฐ€ ƒฐ•˜๋Š” ฐ€žฅ
ƒ P2P๋Š” e-Donkey๋  ƒฐ ๋˜–ด„‹ค. ๋ฌผ๋ก  ง€ธˆ˜ e-Donkey๋Š” •„‹ˆ๋‹ค. ๋‚ดฐ€ ƒฐ•˜๋Š” ๋ถ€๋ถ„œผ๋กœ
 ณ • ง€. •˜ง€๋งŒ ง€ธˆ˜ e-Donkey˜๋Ÿผ œ„œ๋ฒ„๋ฅผ ฐ€งˆ ˆ˜ žˆ ˜•œ „œ๋ฒ„๋ฅผ ฐ€ง€  ฐพ๋Š”
‹ค๋ฉด ๋ถˆ•„š”•œ ๋Œ€—ญญ€ „–ด๋“ค ฒƒ  ๋ถ„‚ฐ๋œ „œ๋ฒ„๋ฅผ •˜๋‚˜˜ ˆœˆ˜ P2P๋กœ ๋ฌถ  „œ๋ฒ„—„œ ด๋–ธŠธ˜
๋…ธ๋“œ๋“ค„ ˆ˜ ••ค€๋‹ค๋ฉด ฐ€žฅ ƒ ง€ •Š„นŒ? ๋  •œ•Œ ๋ฌด‹ žˆ  ๋ฏผ–ˆ๋‹ค. žก†Œ๋ฆฌ  œ ธ๋งŒ!!!!

1.3. The Gnutella Protocol Document


The Gnutella Protocol Document

1. Protocol Specification

1.1 Gnutella๋ž€ Peer to Peer ˜ ๋ถ„‚ฐ ๋ชจ๋ธ๋กœ„œ Meshตฌกฐ˜„Šธ›Œฌ๋ง„ ฐ€ง€๋ฉฐ
Query „†ก„ †ต•ด ๋„Šธ›Œฌ๋‚ด ŒŒ˜ ฒ€ƒ‰ณผ ๋‹šด๋กœ๋“œ๋ฅผ ฐ€๋Šฅ•˜ฒŒ •œ‹ค.

1.2 ”„๋กœ† œ  •˜
5œ˜ Descriptor๋ฅผ ‚ฌšฉ•˜  TCP/IP ”„๋กœ† œณผ ASCII Code๋ฅผ ธฐ๋ฐ˜œผ๋กœ
šฉ•˜—ฌ †ต‹ ด๋ฃจ–ด„‹ค.
- ๋„Šธ›Œฌ๋ง ดˆธฐ „ž… -
~cpp Connection String : GNUTELLA CONNECTION/<version>/nn
~cpp Response Connection : GNUTELLA OKnn
- Note
Note 1 : ๋ชจ๋“  ๋ฐ„•„๋“œ๋Š” Šน๋ณ„•œ ๋ง—†œผ๋ฉด ๋ฆฌ‹€ —”๋””–ธ
Note 2 : IP ฃผ†Œ๋Š” IPv4 ˜•‹œผ๋กœ “ฐธ๋‹ค.
Note 3 : Protocol€ Header™€ Payload๋กœ ตฌ„
- —ค๋”
Descriptor ID (16 byte): ๋„Šธ›Œฌ ƒ˜  œ  ‹๋ณ„ž
Payload Descriptor (2 byte): ๋ช…๋ –ด˜ ‹๋ณ„ž
TTL (1 byte): ๋„Šธ›Œฌ˜ Servent๋ฅผ ง€๋‚ •Œ๋งˆ๋‹ฐ†Œ•˜๋Š” ˆ˜ /
„Šธ›Œฌ ๋ถ€•˜๋ฅผ „ธฐ œ„•“ฐž„
Hops (1 byte): ง€๋‚˜„ Serventˆ˜
Payload Length (4 byte): Header ๋‹Œ— ๋”ฐ๋˜ค๋Š” Descriptor ˜ ธธ
Dataฐ€ ŠคŠธ๋ฆผธฐ ๋•Œ๋ฌธ— ณต๋ฐฑด๋‚˜ Pad Byteฐ€ ๋”ฐ๋˜ง€•Š๋Š”๋‹ค.
Gnutella ”„๋กœ† œ˜ ฒฝšฐ synch๋ฅผ ๋งžถ”๋Š” Šน๋ณ„•œ byteฐ€ กดžฌ•˜ง€ •Š•„
˜•‹— ‹€๋ฆฐ Descriptor๋Š” ธฐ๋œ‹ค.

DescriptorID Payload Descriptor TTL hops PayloadLength
0 15 16 17 18 19 22

- ๋””Šคฌ๋ฆฝ„ฐ (Descriptor)
‘œ1)
ƒ‰ „ค๋ช…
ping „Šธ›Œฌƒ˜ ˜ŠคŠธ๋ฅผ ฐพ„•Œ “ฐธ๋‹ค. Payloadฐ€ —†ธฐ ๋•Œ๋ฌธ— header˜ Payload_Length = 0x00000000 ๋กœ „ •๋œ‹ค.
pong Ping„ ๋ฐ›œผ๋ฉด ฃผ†Œ™€ ธฐƒ€  •๋ณด๋ฅผ ฌ••‘‹•œ‹ค.Port / IP_Address / Num Of Files Shared / Num of KB Shared** IP_Address - Big endian
query „Šธ›Œฌƒ—„œ ฒ€ƒ‰— “ฐ  ฒ€ƒ‰ Minimum Speed ( ‘‹˜ œ†Œ †๋„ ), Search Criteria ฒ€ƒ‰ กฐฑด
queryHit ฒ€ƒ‰ Query กฐฑดณผ ˜•œ ฒฝšฐ QueryHit๋กœ ‘‹•œ‹ค. Num Of Hits กฐฑด— ˜•˜๋Š” Query˜ ฒฐณผ ˆ˜ Port / IP_Address (Big-endian) / Speed / Result Set File Index ( ŒŒผ ๋ฒˆ˜ธ ) File Size ( ŒŒฌธฐ )File Name ( ŒŒด / ๋”๋ธ” ๋„๋กœ ๋๋‚จ ) Servent Identifier ‘‹•˜๋Š” Servent˜  œ  ‹๋ณ„ž Push — “ฐธ๋‹ค.
push ๋ฐฉ™”๋ฒฝ„˜๋œ Servent™€˜ †ต‹ „ œ„•œ DescriptorServent Identifier / File Index / IP_Address(Big-endian)/Port

1.3 ๋ช…๋ –ด ๋šฐŒ…
  1. Pong € Ping™”๋˜ ฐ™€ ธธ„ ๋”ฐ๋ „†ก๋œ‹ค. ๋งŒ•DescriptorIDฐ€ n
    ธ Pong„ ๋ฐ›•˜๋Š” ๋ฐ Descriptor IDฐ€ nธ Ping ๋ณดง€ ๋ชป–ˆ๋‹ค๋ฉด Ping„ ๋ณด
    ๋‚ธ Servent๋Š” ๋„Šธ›Œฌ ƒ—„œ  œฑฐ๋œ ฒƒ„ ˜๋ฏธ•œ‹ค.
  2. QueryHit™€ Query -
  3. Push/QueryHit -
  4.  „‹ฌ ๋˜—ˆ๋˜ Pingณผ Query๋ฅผ  œ™ธ•˜  ๋ชจ๋“  Pingณผ Query๋Š” —ฐฒฐ ๋œ
    ๋ชจ๋“  Servent—  „†ก๋œ‹ค.
  5. TTL/Hop€ ๋‹ค๋ฅธ Servent๋กœ  „†ก๋˜ธฐ  „— ๋ณ€ฒฝ๋˜๋ฉฐ ›„— TTL
    0ด๋ฉด ๋‹ค๋ฅธ Servent๋กœ  „†ก๋˜ง€ •Š๋Š”๋‹ค.
  6.  „—  „†ก๋œ Descriptor๋Š” ๋‹‹œ  „†ก๋˜ง€ •Š๋Š”๋‹ค. ๋„Šธ›Œฌ ๋ถ€•˜ „ž„

    1.4 ŒŒผ ๋‹šด๋กœ๋“œ
    QueryHit ๋ช…๋ –ด๋ฅผ ๋ฐ›œผ๋ฉด ŒŒ„ ดˆธฐ™” •˜ ‹šด๋กœ๋“œ๋ฅผ ‹œž‘•œ‹ค.
    ด๋Š” Gnutella ๋„Šธ›Œฌ๋ฅผ šฉ•˜๋Š” ฒƒ•„‹ˆ๋ธฐกด˜ HTTP ”„๋กœ† œ
    „ šฉ•˜—ฌ ง ‘ ŒŒ „†ก๋œ‹ค.
    GET/get/<File Index>/<File Name>/HTTP/1.0rn
    Connection:Keep-Alivern
    Range:bytes=0-rn
    User-Agent:Gnutellarn3
    rn
    Rangeฐ€ ŒŒ˜ –ด๋ฐ›ธฐฐ€ ฐ€๋Šฅ•˜ฒŒ •จ.
    <File Index>๋Š” ŒŒผ ๋ฒˆ˜  ด๋Š” QueryHit Result— ฌ•จ๋œ ๋‚ดšฉด๋‹ค.
    ™€ฐ™€ HTTP —ค๋”๋ฅผ ๋ฐ›œผ๋ฉด „œ๋ฒ„๋Š” ๋‹Œณผ ฐ™€ —ค๋”๋ฅผ ๋ณด๋‚ดค€๋‹ค.
    HTTP 200 OKrn
    Server:Gnutellarn
    Content-type:application/binaryrn
    Content-length:435678rn
    rn
    ๋ฐ”๋กœ‹Œ— ๋ฐ„ฐ€ Content-length๋งŒผ ๋”ฐ๋˜ฒŒ ๋œ‹ค.
    1.5 ๋ฐฉ™”๋ฒฝ„˜๋œ Servents
    ๋ฐฉ™”๋ฒฝœผ๋กœ •ง ‘ —ฐฒฐด ๋ถˆฐ€๋Šฅ•œ ฒฝšฐ Push Descriptor๋ฅผ ๋ณด๋‚ด šฐŒ…„ †ต•ด ๋ฐ›€
    QueryHit— ๋Œ€•œ ‘‹œผ๋กœ ƒˆ๋กœšด TCP/IP —ฐฒฐƒธด
  7. ‹ค.
    ƒˆ๋กญฒŒ —ฐฒฐ ๋œ ›„
    GIV<File Index>:<Severnt Identifier>/<File Name>nn ๋ฅผ ๋ณด๋‚ด ŒŒ
    „ š”ฒญ•˜๋ฉด
    GET/get/<File Index>/<File Name>/HTTP1.0rn
    Connection:Keep-Alivern
    Range:bytes=0-rn
    User-Agent:Gnutellarn3
    rn
    ณผ ฐ™€ HTTP GET request˜•‹œผ๋กœ ‘‹„ •˜๋ฉฐ ŒŒ„  „†ก•œ‹ค.
    ธ๋Ÿฌ๋‚˜ Push Descriptorกฐฐจ ๋ณด๋‚ดง€ ๋ชป•˜๋ฉด ŒŒ „†ก€ ๋ถˆฐ€๋Šฅ•˜‹ค.

    1.6 ™•žฅ๋œ Gnutella ”„๋กœ† œ
    ธฐกด˜ Gnutellaฐ€ ๋‹ค๋ฅธ ”„๋กœธ๋žจ(BearShare) — ˜•„œ๋น„Šค ๋˜๋ฉด„œ
    ™•žฅ๋œ ”„๋กœ† œ •„š”•˜ฒŒ ๋˜—ˆ๋‹ค. ด๋ฅผ Triler๋  •˜๋ฉฐ QueryHit ˜
    ResultSet ๋งˆง€๋ง‰ ๋”๋ธ”๋„ ณผ Servent ID‚ฌ— ๋“ค–ด„‹ค.
    - Trailer
    VendorCode(3byte) OpenDataSize(1byte) OpenData(2byte) PrivateData(n)

2. Gnutella Core Code
2.1 Data Structure
File Name : Packet.Cpp
Common IP / ExIP / Node / NodeEx
GnutellaPacket packet_Header / packet_Ping / packet_Pong
packet_Push / packet_Query / packet_QueryHit

2.2 Class Hierarchal Diagram

3. Gnucleus Technical Description
Gnuclues๋Š” Gnutella ”„๋กœ Šธ ‘ OpenSoure๋กœ ‹ œ „Ž˜Šค ๋ถ€๋ถ„—ด•…•˜‹ค.
•˜ง€๋งŒ Gnucleus˜ Core ฝ”๋“œ ๋ถ€๋ถ„˜ Docunmentฐ€ ฐ€žฅ ž˜ ๋‚˜™€žˆ  ‹ œ๋กœ
Compile / Execute ฐ€๋Šฅ•œ Code๋ฅผ †— –ป„ ˆ˜ žˆ๋Š” ”„๋กœธ๋žจด๋‹ค. ๋ฌผ๋ก 
ง€ธˆ ƒƒœ๋Š” ๋ฒ„ „˜ ˜™˜„œผ๋กœ •ด Gnucleus node— ‹ œ ๋…ธ๋“œ—  ‘†•˜๋Š” ฒƒ
–ด๋ ง€๋งŒ ฐ™€ ๋ฒ„ „ ‚ฌ˜  ‘†€ ฐ€๋Šฅ•˜๋ฏ€๋กœ „Ž˜Šค ๋ถ€๋ถ„„ ˆ˜ ••œ‹ค๋ฉด
๋ณด๋‹‹€ ”„๋กœธ๋žจœผ๋กœ ๋ณ€˜••  ˆ˜ žˆ„ ฒƒ ฐ™๋‹ค.
˜•œ Entica—„œ •„š”๋กœ•˜๋Š” Search / MultiThreadDownloader๋ฅผ ง€›•˜๋ฉฐ
˜•œ ฐ€žฅ ธฐ๋ณธ ธฐ๋Šฅ„ ตฌ˜„•˜—ฌ ๋ถˆ•„š”•œ †ŒŠคฝ”๋“œฐ€  ๋‹ค๋Š” žฅ ๋„ žˆ๋‹ค.
ด๋Ÿฐ œ ๋กœ‹ค๋ฅธ ๋ช‡๋ช‡ Gnutella ”„๋กœธ๋žจ๋„ Gnucleus๋ฅผ ธฐ๋ฐ˜œผ๋กœ ž‘„ฑ ๋˜–ดกŒ๋‹ค.

4. Note
servent : server ™€ client ˜ •„–ด
little endian byte : ž‘€ ชฝ (๋ฐ”Šธ —ด—„œ ฐ€žฅ ž‘€ ฐ’)ด ๋จผ €  €žฅ๋˜๋Š” ˆœ„œ
descriptor : Œจ‚ฐ–๋Š” ˜๋ฏธ
payload : Œจ‚ ฐ–๋Š” ๋ฐƒ€

5. ฐธ  URL

http://www.gnucleus.com/ (Gnucleus ”„๋กœธ๋žจ)

http://www.sourceforge.net/ (Gnutella Clone ”„๋กœธ๋žจ)

http://www.gnutelladev.com/source/gnucleus0.html (†ŒŠคฝ”๋“œ)



1.4. ธฐƒ€ ฝ”๋“œ— ด€•œ „ค๋ช…



Gnucleus—„œ‹šด๋กœ๋“œ ๋ฐ›๋Š” ๋ฐฉ๋ฒ•— ๋Œ€•œ „ค๋ช…
~cpp 
void CSearchResults::OnButtonDownload() 
{
std::list<ResultGroup>::iterator itGroup;
POSITION pos = m_lstResults.GetFirstSelectedItemPosition(); 

while(pos)
{
int nItem = m_lstResults.GetNextSelectedItem(pos); 
ResultGroup* pGroup = (ResultGroup*) m_lstResults.GetItem(nItem);

if(pGroup)
RelayDownload(*pGroup); 
}
}
—„œ‹šด๋กœ๋“œ ๋ฒ„Šผ„ ๋ˆ„๋ฅด๋ฉด ฒฐณผ ธ๋ฃน‘—„œ pos๋ฅผ ธฐ–ต•˜  ด pos๋ฅผ šฉ•ด ๋‹šด๋ฐ›„
ŒŒ„ „ ƒ•˜  ธ๋ฃน˜ ฒฐณผฐ’„ RelayDownload •ˆ˜˜  „‹ž๋กœ ๋ณด๋‚ธ๋‹ค.
~cpp 
void CSearchResults::RelayDownload(ResultGroup &Item) —„œ๋Š” 
CGnuDownloadShell* Download = new CGnuDownloadShell(m_pComm);
—„œ™€ ฐ™ƒˆ๋กœšด ๋‹šด๋กœ๋“œ ‰˜„ ๋งŒ๋“ค 
~cpp 
m_pComm->m_DownloadList.push_back(Download); 
™€ ฐ™ด m_DownloadList— Download ฒด๋ฅผ ‚ฝž…•˜  CGnuControl—„œ  œ–ด•˜ฒŒ ๋งŒ๋“ ‹ค.
~cpp 
Download->m_Name = Item.Name;
Download->m_Search = ReSearch;
Download->m_FileLength = Item.Size;
Download->m_AvgSpeed = Item.AvgSpeed;
ฐ™ดˆธฐ™”๋ฅผ •œ‹ค.
~cpp 
// Add hosts to the download list
for(int i = 0; i < Item.ResultList.size(); i++)
Download->AddHost( Item.ResultList[i] );
˜๋Ÿผ DownloadShell— AddHost•ˆ˜๋ฅผ †ต•ด Item˜ ๋ชจ๋“  Host๋ฅผ ๋‹šด๋กœ๋“œ — ๋„ฃ๋Š”๋‹ค.
ธ๋Ÿฌ๋ฉด View — Download— ด€•œ Ž˜ง€๋ฅผ —…๋ฐŠธ•˜  DownloadShell˜ ƒ„žฐ€ ‹–‰ด ๋œ‹ค.


CGnuControl—„œ˜ void CGnuControl::ManageDownloads()— ˜• œ–ด๋œ‹ค.
void CGnuDownloadShell::Start() ๋กœ‹šด๋กœ๋“œฐ€ ‹œž‘ด ๋˜  ‹ œ ธ ๋‹šด๋กœ๋“œ๋Š” CGnuDownload—„œ ด๋ฃจ–ดง€๋ฉด ‰˜—„œ๋Š” Timer()—„œ CheckCompletion()๋กœ ™„๋ฃŒ ๋˜—ˆ๋Š” ง€ ™•„ •˜ฒŒ ๋˜  AttachChunk2Chunk ™€ AttachChunk2Partial๋กœ ๋ถ€๋ถ„๋ถ€๋ถ„ ™„๋ฃŒ๋œ Chunk๋“ค„ ฒฐ••ฃผ๋Š” —ญ™œ„ •˜ฒŒ ๋œ‹ค.
‹ œ œผ๋กœ •˜๋‚˜˜ Host๋งˆ๋‹CGnuDownload ด๋ž˜Šค๋ฅผ ฐ–ฒŒ ๋˜๋ฉฐ ๋ฐƒ€๋ฅผ ๋ฐ›๋Š” †Œผ“ด ๋œ‹คm_StartPosฐ€ ๋ฐ›ธฐ ‹œž‘•˜๋Š” Chunk˜ ‹œž‘„ ๋‚˜ƒ€๋‚ด๋ฉฐ ReadyFile()—„œ๋Š”  „˜ ๋ฐ›๋˜ ŒŒžˆ๋Š” ง€ กฐ‚ฌ›„— File„ —ฐ๋‹ค.
StartDownload() •ˆ˜—„œ‹šด๋กœ๋“œ๋ฅผ ‹œž‘•˜๋ฉฐ GetStartPos() ๋ฅผ †ต•ด Chunkฐ€ ๋‹šด๋กœ๋“œฐ€ ‹œž‘•  m_pChunk->m_StartPos˜ œ„˜๋ฅผ •ŒฒŒ •œ‹ค.
~cpp 
m_StartPos = m_pShell->m_BytesCompleted + ((m_pShell->m_FileLength - m_pShell->m_BytesCompleted) / 2);
m_pChunk->StartPos = m_StartPos;
m_pChunk->FileLength = m_pShell->m_FileLength - m_StartPos; 
ณต‹œผ๋กœ Chunk˜ ‹œž‘œ„˜๋ฅผ ตฌ•œ‹ค.
SendRequest() —„œ HTTP/GET ˜•‹œผ๋กœ —ค๋”๋ฅผ ๋ณด๋‚ด ๋ฐ› ž •˜๋Š” ๋ฐƒ€๋ฅผ š”ฒญ•œ‹
OnReceive(int nErrorCode) —„œ Content-length ๋งŒผ˜ ๋ฒ„ผ ๋ฐƒ€๋ฅผ ๋ฐ›•„ ฒญฌ™€ —ฐฒฐ ‹œ‚จ๋‹ค.
–ด ๋ฐ›ธฐ๋ฅผ • •Œ—๋Š” ŒŒ˜ ๋—„œ -4096๋งŒผ –ป  m_Verification ๋ธ”๋Ÿญ˜ 4096ฌธฐ ๋งŒผ ๋น„ต๋ฅผ •œ ›„— –ด๋ฐ›ธฐ๋ฅผ ‹œž‘•œ‹ค.
ƒˆ๋กœšด ฒญฌ๋ฅผ ๋งŒ๋“œ๋Š” กฐฑด€ ด๋ฏธ ™„๋ฃŒ๋œ ฒญฌ˜ ๋‚จ€ ๋ถ€๋ถ„EmptySize > 16384 ๋ณด๋‹ปค•
•œ‹ค๋Š” ฒƒด๋‹ค.
†ŒŠค๋Š” ๋‹Œณผ ฐ™ 
~cpp 
// Reset m_pChunk because this can be called multiple times
if(m_pChunk)
{
bool destroy = true; 
for(int i = 0; i < m_pShell->m_ChunkList.size(); i++)
if(m_pShell->m_ChunkList[i] == m_pChunk)
destroy = false;

if(destroy)
delete m_pChunk;

m_pChunk = NULL;
}
๋ถ€๋ถ„€ †Œผ“˜ ฒญฌ‘— ง€ธˆ˜ ฒญฌฐ€ —†๋‹ค๋ฉด ง€ธˆ ๋ฐ›€ ฒญฌ๋Š” ๋๋งˆœ ฒƒœผ๋กœ
ƒฐ•˜  m_pChunk = NULL๋กœ ๋งŒ๋“ ‹






Gnucleus—„œ ”„๋กœ† œ †ต‹ 

GnuCreateGuid(&Guid) // DescriptorID ƒ„
šฐŒ…‹œ —ฐฒฐ๋œ ๋ชจ๋“  nodeList—„œ key->Origin๋ฅผ ฐพ•„๋‚ด–ด key->Origin๋ฅผ  œ™ธ•œ ๋ชจ๋“  node— ๋ฐ›€ pong ๋˜๋Š” queryHit๋ฅผ  „‹
- Search
~cpp 
int length = 25 + m_Search.GetLength() + 1;
pNode->SendPacket(m_Packet, length, PACKET_QUERY, true); 
- Result Set
~cpp 
// Extract results from the packet
while(HitsLeft > 0 && NextPos < Length - 16)
{ 
Result Item;

memcpy(&TempX, &Packet[NextPos], 4);
Item.FileIndex = makeD( flipX(TempX)); 
memcpy(&TempX, &Packet[NextPos + 4], 4);
Item.Size = makeD( flipX(TempX));

Item.Host = QueryHit->Host;
Item.Port = QueryHit->Port;
Item.Speed = makeD( flipX(QueryHit->Speed));

Item.Firewall = Firewall;
Item.Busy = Busy;
Item.Stable = Stable;
Item.ActualSpeed = ActualSpeed;

if(ExtendedPacket)
Item.Vendor = Vendor;

Item.Origin = Log->Origin;
memcpy(&Item.PushID, &Packet[Length - 16], 16);
Item.Distance = Log->Header->Hops;

// Get Filename
for(i = NextPos + 8; Packet[i] != 0; i++)
if(i < Length - 16)
Item.Name += (char) Packet[i];
else
break;

// Pass any data between double null
while(Packet[++i] != 0)
if(i > Length - 16)
break;


Item.NameLower = Item.Name;
Item.NameLower.MakeLower();
Item.Icon = m_pDoc->GetIconIndex(Item.NameLower);

m_WholeList.push_back(Item);

// Screen Item to user's preferences
if(Inspect(Item))
{
m_CurrentList.push_back(Item);
m_tabResults->UpdateList( AddtoGroup(Item) );
}

// Check for end of reply packet
if(i + 1>= Length - 16)
HitsLeft = 0;
else
{
HitsLeft--;
NextPos = i + 1;
}
}

Œจ‚˜ packet_QueryHit —„œ ResultSet„ ถ”œ•˜—ฌ Item Vector— ๋„–ดค€๋‹ค.
~cpp 
void CGnuNode::Recieve_Ping(packet_Ping* Ping, int nLength)
key_Value* key = m_pComm->m_TableRouting.FindValue(&Ping->Header.Guid); 
†ต•ด ๋ฐ›•˜๋˜ •‘ง€ ฒ€‚ฌ•˜  if(key == NULL) ๋ฐ›•˜๋˜ •‘•„‹ˆ๋ƒˆ๋กœšด •‘ด๋ผ๋ฉด m_pComm->m_TableRouting.Insert(&Ping->Header.Guid, this) ˜๋Ÿผ ๋šฐŒ… …Œด๋ธ”— ๋„  Pong„ ๋ณด๋‚ดค€๋‹ค.



๋ฐฉ™”๋ฒฝ„˜๋œ ฒฝšฐ˜ ž„•œ „ค๋ช…
~cpp 
UINT AttemptPort = pPrefs->m_ForcedPort ? pPrefs->m_ForcedPort : pPrefs->m_LocalPort;
AttemptPort += rand() % 99 + 0; 
Firewall— žˆ„ ฒฝšฐ ด๋Ÿฐ ๋ฐฉ๋ฒ•œผ๋กœ ฌŠธ๋ฅผ —ดง€ ๋ชป•˜๋ฉด ๋žœ๋ค•œ ฌŠธ๋ฅผ ๋ถ€—ฌ ForcedPort๋กœ  ‘† Attempts < 3 ๋งŒํผ ์‹œ๋„๋ฅผ ํ•œ๋‹ค.
ธ๋ฆฌ  PUSH๋ฅผ Route PUSH๋ฅผ †ต•ด ๋ณด๋‚ด ธ๋ˆ„…”๋ผ default ฌŠธฐ€ •„‹Œ —ด ˆ˜ žˆ๋Š” ฌŠธ๋กœ ง ‘—ฐฒฐ„ •œ‹ค.
๋งŒ•ƒ๋Œ€๋ฐฉ „œ๋ฒ„ฐ€ FireWall— žˆ๋‹ค๋ฉด QueryHit‘˜ bool Firewall;•„๋“œฐ€ Trueฐ€ ๋˜๋ฏ€๋กœ — ๋Œ€•œ ‘‹œผ๋กœ
~cpp  
Item.Host = QueryHit->Host; Item.Port = QueryHit->Port;
— •ด๋‹•˜๋Š” Port๋กœ Download๋ฅผ •œ‹ค.



1.5. Thread


1.6. ฐธ  ๋งฌ

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:23:18
Processing time 0.0461 sec