Seite 1 von 1

Torrent client

Verfasst: Mittwoch 15. September 2010, 23:01
von Yggel
Hallo zusammen :)

Ich versuche meinen eigenen kleinen Torrent Client zu schreiben und scheitere jetzt an der Verbindung zu den einzelnen Peers :/

Hier sind meine Resourcen was das Protokol angehen:
http://wiki.theory.org/BitTorrentSpecification
http://jonas.nitro.dk/bittorrent/bittorrent-rfc.html

Hier mal der Code:

Code: Alles auswählen

# Handshake
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((ip, port))
s.send('\x13BitTorrent protocol\x00\x00\x00\x00\x00\x10\x00\x05' + info_hash + peer_id)
rsp = s.recv(68) # Groesse des Handshakes

# Send Interested
s.send('\x00\x01\x02')

# Send Request
s.send('\x00\x0D\x06\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00')
IP und Port kommen vom Tracker, der info_hash aus dem .torrent file und die peer_id besteht aus 'A'*20.
Der Handshake funktioniert soweit, bei den Messages steh ich jedoch auf dem Schlauch, weil diese ja asynchron übertragen werden.
Wie komm ich jetzt an die Daten, die ich requested habe?
Muss ich einfach ein socket an meinen offenen Port binden und warten das etwas ankommt?
Wenn ja, wie würde das aussehen? Meine bisherigen Versuche damit waren erfolglos :(
Ausserdem bin ich nicht sicher ob meine Messages richtig zusammengesetzt sind..
aber darum kann ich mich ja kümmern, wenn ich die nicht mehr ins Blaue schieße und zumindest weiß obs ne Antwort darauf gab.

Vielen Dank :)

Re: Torrent client

Verfasst: Donnerstag 16. September 2010, 13:50
von lutz.horn
Hast Du mal, unabhängig von BitTorrent, mit Python Socket-Programmierung gemacht?

Re: Torrent client

Verfasst: Donnerstag 16. September 2010, 14:47
von Yggel
Nichts was über simple Client/Server Sachen hinaus geht.
Ich hab ein wenig rumprobiert und bin insofern weiter gekommen, als das mir andere Clients von sich aus Handshakes schicken, die ich erwiedere.
Leider hörts da schon wieder auf.
Als nächstes werde ich mich wohl intensiver mit dem original BitTorrent source auseinander setzen müssen, vielleicht bringt mich das ja weiter :)


Grüße,

Yggel

Re: Torrent client

Verfasst: Donnerstag 16. September 2010, 17:53
von Dauerbaustelle
Sicher, dass du keine Torrent-Library verwenden willst? Wenn ja, dürfte das ``struct``-Modul wohl recht hilfreich sein. Damit kann man "C-Datenstrukturen" auf Python abbilden. Das dürfte etwas einfacher sein als handgefriemelte Bytestrings zu schreiben.

Re: Torrent client

Verfasst: Donnerstag 16. September 2010, 19:58
von Yggel
Ja, eigentlich wollte ich ein wenig mit dem Protokol rumspielen, deshalb sind mir die Librarys zu abstrakt :)
Ich werd mir structs mal ansehen, vielen Dank!

Grüße,

Yggel

Re: Torrent client

Verfasst: Donnerstag 16. September 2010, 20:47
von gerold
Hallo Yggel!

Deluge http://deluge-torrent.org/ ist in Python programmiert. Es verwendet *libtorrent* http://git.deluge-torrent.org/libtorrent.git/. Vielleicht kannst du dir da etwas abschauen.

mfg
Gerold
:-)

Re: Torrent client

Verfasst: Samstag 18. September 2010, 01:26
von Leonidas
Wäre es nicht einfacher, vom Mainline-Bittorrent abzuschauen, der in Python programmiert wurde?

Re: Torrent client

Verfasst: Samstag 18. September 2010, 01:54
von name
Lies dich mal in die Socket Dokumentation ein, bevor du damit etwas machst, ich zitiere:
socket.send(string[, flags])¶… Returns the number of bytes sent. Applications are responsible for checking that all data has been sent; if only some of the data was transmitted, the application needs to attempt delivery of the remaining data.
Zudem kann man nicht davon ausgehen, dass recv alle Daten beim ersten Mal zurückgibt. Das heißt, wenn du s.recv(10) aufrufst, kann es gut sein, dass nur 5 Bytes zurückgegeben werden. Vergleiche auch 'man recv':
The receive calls normally return any data available, up to the requested amount, rather than waiting for receipt of the full amount requested.
Alternativ dazu kannst du natürlich auch ein existierendes Netzwerkframework nutzen, dass dir solche – sagen wir einmal – Details erspart.

Re: Torrent client

Verfasst: Samstag 18. September 2010, 09:24
von gerold
Leonidas hat geschrieben:Wäre es nicht einfacher, vom Mainline-Bittorrent abzuschauen, der in Python programmiert wurde?
Ahh, das wusste ich nicht. :-)