Torrent client

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Yggel
User
Beiträge: 4
Registriert: Mittwoch 15. September 2010, 22:24

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 :)
Benutzeravatar
lutz.horn
User
Beiträge: 205
Registriert: Dienstag 8. November 2005, 12:57
Wohnort: Pforzheim

Hast Du mal, unabhängig von BitTorrent, mit Python Socket-Programmierung gemacht?
https://www.xing.com/go/invite/18513630.6a91d4
Yggel
User
Beiträge: 4
Registriert: Mittwoch 15. September 2010, 22:24

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
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

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.
Yggel
User
Beiträge: 4
Registriert: Mittwoch 15. September 2010, 22:24

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
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Wäre es nicht einfacher, vom Mainline-Bittorrent abzuschauen, der in Python programmiert wurde?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
name
User
Beiträge: 254
Registriert: Dienstag 5. September 2006, 16:35
Wohnort: Wien
Kontaktdaten:

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.
Zuletzt geändert von name am Samstag 18. September 2010, 16:44, insgesamt 4-mal geändert.
Ohloh | Mein Blog | Jabber: segfaulthunter@swissjabber.eu | asynchia – asynchrone Netzwerkbibliothek

In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Leonidas hat geschrieben:Wäre es nicht einfacher, vom Mainline-Bittorrent abzuschauen, der in Python programmiert wurde?
Ahh, das wusste ich nicht. :-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Antworten