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 ์—ฐ๊ฒฐ์ด ์ƒ๊ธด
๋‹ค.
์ƒˆ๋กญ๊ฒŒ ์—ฐ๊ฒฐ ๋œ ํ›„
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 (์†Œ์Šค์ฝ”๋“œ)

CVS// http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/gnucleus/(์ตœ๊ทผ์˜ ์†Œ์Šค์ฝ”๋“œ)


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