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.0434 sec