1.1. μμμ μμμ ¶
λ¦κ² μ΄ κΈμ μ¬λ¦° κ²μ λν΄ λ―Έμνλ€.
μ΄ λ¬Έμλ λ΄κ° μλ₯΄λ°μ΄νΈλ₯Ό νλ©΄μ λ²μκ³Ό μμ±ν λ¬Έμμ΄λ€.
μ§κΈμ μ€νμμλ λΌμ°ν λΆλΆμ λ§΄κ³Ό μΊμ¬μ μμ΄μμ λ§μ λΆλΆ μμ μ΄ κ°ν΄μ‘λ€.
λλΆλΆμ P2P νλ‘κ·Έλ¨λ€μ΄ λν λΌμ λ°©λ²μ κΈ°λ³ΈμΌλ‘ μμ± λμμΌλ©° μ§κΈμ μ λμ
IPλ₯Ό κ°λ νκ²½μμλ μ΄λ₯Ό λ°μ΄ λλ λ°©λ²μ μμ κ²μΌλ‘ 보μ¬μ§λ€.
νμ IPv6κ° λμ¨λ€λ©΄ κ°κ°μ μμ€ν μ΄ μλ μ΄ν리μΌμ΄μ μ IPλ₯Ό λΆμΌ μ μκ² λμ΄μ§λ€κ³
μ½μ μ μ΄ μλ€. μ΄ λ λλ©΄ λ³΄λ€ νκΈ°μ μΈ P2P νλ‘κ·Έλ¨μ΄ λμ¬ κ²μΌλ‘ 보μΈλ€.
μ΄ λ¬Έμλ λ΄κ° μλ₯΄λ°μ΄νΈλ₯Ό νλ©΄μ λ²μκ³Ό μμ±ν λ¬Έμμ΄λ€.
μ§κΈμ μ€νμμλ λΌμ°ν λΆλΆμ λ§΄κ³Ό μΊμ¬μ μμ΄μμ λ§μ λΆλΆ μμ μ΄ κ°ν΄μ‘λ€.
λλΆλΆμ P2P νλ‘κ·Έλ¨λ€μ΄ λν λΌμ λ°©λ²μ κΈ°λ³ΈμΌλ‘ μμ± λμμΌλ©° μ§κΈμ μ λμ
IPλ₯Ό κ°λ νκ²½μμλ μ΄λ₯Ό λ°μ΄ λλ λ°©λ²μ μμ κ²μΌλ‘ 보μ¬μ§λ€.
νμ IPv6κ° λμ¨λ€λ©΄ κ°κ°μ μμ€ν μ΄ μλ μ΄ν리μΌμ΄μ μ IPλ₯Ό λΆμΌ μ μκ² λμ΄μ§λ€κ³
μ½μ μ μ΄ μλ€. μ΄ λ λλ©΄ λ³΄λ€ νκΈ°μ μΈ P2P νλ‘κ·Έλ¨μ΄ λμ¬ κ²μΌλ‘ 보μΈλ€.
μλμ κΈμ κ°λ³κ² μ½μ΄ μ£ΌμκΈΈ....
1.2. μ£ΌμΈμ₯μ΄ μκ°νλ κ°μ₯ μ΄μμ μΈ P2Pλ ¶
κ·Έλν
λΌλ νμ€ν λ§€λ ₯μ μ΄κ³ λν μ΄μμ μΈ μμ P2PλΌλ μκ°μ΄ λ λ€. νμ§λ§ P2Pλ λ§μ λΆλΆ
ν¬μ(?)μ΄ νμνλ€. μ¬κΈ°μ ν¬μμ΄λ λΆνμνμ§λ§ μΈ μ λ°μ΄ μλ λμνμ λ§νλ€.
λ΄κ° μ°Ύκ³ μ νλ νμΌμ΄ λκ° κ°μ§κ³ μλ μ§ μκ³ μλ€λ©΄ κ΅³μ΄ P2Pλ νμνμ§ μμ κ²μ΄λ€.
ν¬μ(?)μ΄ νμνλ€. μ¬κΈ°μ ν¬μμ΄λ λΆνμνμ§λ§ μΈ μ λ°μ΄ μλ λμνμ λ§νλ€.
λ΄κ° μ°Ύκ³ μ νλ νμΌμ΄ λκ° κ°μ§κ³ μλ μ§ μκ³ μλ€λ©΄ κ΅³μ΄ P2Pλ νμνμ§ μμ κ²μ΄λ€.
νμ§λ§ μ΄λ¬ν ν¬μμ μ€μ΄λ κ²μ΄ λ³΄λ€ μ’μ κ²μ΄λΌλ μκ°μ΄ λ λ€. κ·Έλ° μ μμ λ΄κ° μκ°νλ κ°μ₯
μ΄μμ μΈ P2Pλ e-DonkeyλΌκ³ μκ° λμ΄μ§λ€. λ¬Όλ‘ μ§κΈμ e-Donkeyλ μλλ€. λ΄κ° μκ°νλ λΆλΆμΌλ‘
κ³ μ³μ ΈμΌ κ² μ§. νμ§λ§ μ§κΈμ e-Donkeyμ²λΌ κ°μΈμ΄ μλ²λ₯Ό κ°μ§ μ μκ³ λν μ΄ μλ²λ₯Ό κ°μ§κ³ μ°Ύλ
λ€λ©΄ λΆνμν λμνμ μ€μ΄λ€ κ²μ΄κ³ λΆμ°λ μλ²λ₯Ό νλμ μμ 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λ₯Ό κΈ°λ°μΌλ‘
μ΄μ©νμ¬ ν΅μ μ΄ μ΄λ£¨μ΄μ§λ€.
- λ€νΈμν¬λ§ μ΄κΈ° μ§μ -
- Note
Note 1 : λͺ¨λ λ°μ΄ν° νλλ νΉλ³ν λ§μ΄ μμΌλ©΄ 리ν μλμΈ
Note 2 : IP μ£Όμλ IPv4 νμμΌλ‘ μ°μΈλ€.
Note 3 : Protocolμ Headerμ Payloadλ‘ κ΅¬μ±
- ν€λ
Descriptor ID (16 byte): λ€νΈμν¬ μμ κ³ μ μλ³μ
Payload Descriptor (2 byte): λͺ λ Ήμ΄μ μλ³μ
TTL (1 byte): λ€νΈμν¬μ Serventλ₯Ό μ§λ λλ§λ€ κ°μνλ μ /
Payload Length (4 byte): Header λ€μμ λ°λΌμ€λ Descriptor μ κΈΈμ΄
μ΄μ©νμ¬ ν΅μ μ΄ μ΄λ£¨μ΄μ§λ€.
- λ€νΈμν¬λ§ μ΄κΈ° μ§μ -
~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λ νκΈ°λλ€.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 λͺ
λ Ήμ΄ λΌμ°ν
- Pong μ Pingμ΄ μλ κ°μ κΈΈμ λ°λΌ μ μ‘λλ€. λ§μ½ DescriptorIDκ° n
μΈ Pongμ λ°μλ λ° Descriptor IDκ° nμΈ Ping λ³΄μ§ λͺ»νλ€λ©΄ Pingμ 보
λΈ Serventλ λ€νΈμν¬ μμμ μ κ±°λ κ²μ μλ―Ένλ€.
- QueryHitμ Query -
- Push/QueryHit -
- μ λ¬ λμλ Pingκ³Ό Queryλ₯Ό μ μΈνκ³ λͺ¨λ Pingκ³Ό Queryλ μ°κ²° λ
λͺ¨λ Serventμ μ μ‘λλ€.
- TTL/Hopμ λ€λ₯Έ Serventλ‘ μ μ‘λκΈ° μ μ λ³κ²½λλ©° νμ TTLμ΄
0μ΄λ©΄ λ€λ₯Έ Serventλ‘ μ μ‘λμ§ μλλ€.
- μ μ μ μ‘λ 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.1 Data Structure
3. Gnucleus Technical DescriptionFile Name : Packet.Cpp
Common IP / ExIP / Node / NodeEx
GnutellaPacket packet_Header / packet_Ping / packet_Pong
2.2 Class Hierarchal DiagramCommon IP / ExIP / Node / NodeEx
GnutellaPacket packet_Header / packet_Ping / packet_Pong
Gnucluesλ Gnutella νλ‘μ νΈ μ€ OpenSoureλ‘ μ€μ μΈν°νμ΄μ€ λΆλΆμ΄ μ΄μ
νλ€.
νμ§λ§ Gnucleusμ Core μ½λ λΆλΆμ Docunmentκ° κ°μ₯ μ λμμκ³ μ€μ λ‘
Compile / Execute κ°λ₯ν Codeλ₯Ό μμ μ»μ μ μλ νλ‘κ·Έλ¨μ΄λ€. λ¬Όλ‘
μ§κΈ μνλ λ²μ μ νΈνμ±μΌλ‘ μΈν΄ Gnucleus nodeμ μ€μ λ Έλμ μ μνλ κ²μ΄
μ΄λ ΅μ§λ§ κ°μ λ²μ μ¬μ΄μ μ μμ κ°λ₯νλ―λ‘ μΈν°νμ΄μ€ λΆλΆμ μμ νλ€λ©΄
λ³΄λ€ μ’μ νλ‘κ·Έλ¨μΌλ‘ λ³νν μ μμ κ² κ°λ€.
λν Enticaμμ νμλ‘νλ Search / MultiThreadDownloaderλ₯Ό μ§μνλ©°
λν κ°μ₯ κΈ°λ³Έμ μΈ κΈ°λ₯μ ꡬννμ¬ λΆνμν μμ€μ½λκ° μ λ€λ μ₯μ λ μλ€.
μ΄λ° μ΄μ λ‘ λ€λ₯Έ λͺλͺ Gnutella νλ‘κ·Έλ¨λ Gnucleusλ₯Ό κΈ°λ°μΌλ‘ μμ± λμ΄μ‘λ€.
4. Noteνμ§λ§ Gnucleusμ Core μ½λ λΆλΆμ Docunmentκ° κ°μ₯ μ λμμκ³ μ€μ λ‘
Compile / Execute κ°λ₯ν Codeλ₯Ό μμ μ»μ μ μλ νλ‘κ·Έλ¨μ΄λ€. λ¬Όλ‘
μ§κΈ μνλ λ²μ μ νΈνμ±μΌλ‘ μΈν΄ Gnucleus nodeμ μ€μ λ Έλμ μ μνλ κ²μ΄
μ΄λ ΅μ§λ§ κ°μ λ²μ μ¬μ΄μ μ μμ κ°λ₯νλ―λ‘ μΈν°νμ΄μ€ λΆλΆμ μμ νλ€λ©΄
λ³΄λ€ μ’μ νλ‘κ·Έλ¨μΌλ‘ λ³νν μ μμ κ² κ°λ€.
λν Enticaμμ νμλ‘νλ Search / MultiThreadDownloaderλ₯Ό μ§μνλ©°
λν κ°μ₯ κΈ°λ³Έμ μΈ κΈ°λ₯μ ꡬννμ¬ λΆνμν μμ€μ½λκ° μ λ€λ μ₯μ λ μλ€.
μ΄λ° μ΄μ λ‘ λ€λ₯Έ λͺλͺ Gnutella νλ‘κ·Έλ¨λ Gnucleusλ₯Ό κΈ°λ°μΌλ‘ μμ± λμ΄μ‘λ€.
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μμ λ€μ΄λ‘λ λ°λ λ°©λ²μ λν μ€λͺ
νμΌμ μ ννκ³ κ·Έ κ·Έλ£Ήμ κ²°κ³Όκ°μ RelayDownload ν¨μμ μ λ¬μΈμλ‘ λ³΄λΈλ€.
κ·Έλ¬λ©΄ View μ Downloadμ κ΄ν νμ΄μ§λ₯Ό μ λ°μ΄νΈνκ³ DownloadShellμ μμ±μκ° μ€νμ΄ λλ€.
~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μ μμΉλ₯Ό μκ² νλ€.
SendRequest() μμ HTTP/GET νμμΌλ‘ ν€λλ₯Ό λ³΄λ΄ λ°κ³ μ νλ λ°μ΄νλ₯Ό μμ²νλ€
OnReceive(int nErrorCode) μμ Content-length λ§νΌμ λ²νΌ λ°μ΄νλ₯Ό λ°μ μ²ν¬μ μ°κ²° μν¨λ€.
μ΄μ΄ λ°κΈ°λ₯Ό ν λμλ νμΌμ λμμ -4096λ§νΌ μ»κ³ m_Verification λΈλμ 4096ν¬κΈ° λ§νΌ λΉκ΅λ₯Ό ν νμ μ΄μ΄λ°κΈ°λ₯Ό μμνλ€.
μλ‘μ΄ μ²ν¬λ₯Ό λ§λλ 쑰건μ μ΄λ―Έ μλ£λ μ²ν¬μ λ¨μ λΆλΆμ΄ EmptySize > 16384 λ³΄λ€ μ»€μΌ
νλ€λ κ²μ΄λ€.
μμ€λ λ€μκ³Ό κ°κ³
μκ°νκ³ m_pChunk = NULLλ‘ λ§λ λ€
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
λΌμ°ν μ μ°κ²°λ λͺ¨λ 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μ 보λ΄μ€λ€.
λ°©νλ²½μ΄ μ€μΉλ κ²½μ°μ μμΈν μ€λͺ
κ·Έλ¦¬κ³ PUSHλ₯Ό Route PUSHλ₯Ό ν΅ν΄ λ³΄λ΄ κ·Έλν λΌ default ν¬νΈκ° μλ μ΄ μ μλ ν¬νΈλ‘ μ§μ μ°κ²°μ νλ€.
λ§μ½ μλλ°© μλ²κ° FireWallμ μλ€λ©΄ QueryHitμ€μ bool Firewall;νλκ° Trueκ° λλ―λ‘ μ΄μ λν μλ΅μΌλ‘
~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λ₯Ό νλ€.