Problem mit TCP/IP

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Python 47
User
Beiträge: 574
Registriert: Samstag 17. September 2005, 21:04

Samstag 15. Januar 2011, 17:20

Hallo,

ich habe ein Problem bezüglich sockets. Ich programmier mit nem Kumpel zur Zeit ein Chatprogramm, bei dem die Nachrichten beziehungsweise Dateien per AES verschlüsselt wurden, und beim Start per Diffie Hellman Key Exchange ein Schlüssel ausgetauscht wird. Das Programm ist soweit fertig. Einziges Problem: Per UDP funktioniert das Senden der Nachrichten einwandfrei. Da wir allerdings auch Dateien verschicken wollen, müssen wir das ganze per TCP/IP machen. Dazu habe ich die Funktionen, die auch in der Dokumentation als Beispiele angegeben werden implementiert:

Code: Alles auswählen

# Echo server program
import socket

HOST = ''                 # Symbolic name meaning all available interfaces
PORT = 50007              # Arbitrary non-privileged port
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(1)
conn, addr = s.accept()
print 'Connected by', addr
while 1:
    data = conn.recv(1024)
    if not data: break
    conn.send(data)
conn.close()
und

Code: Alles auswählen

# Echo client program
import socket

HOST = 'daring.cwi.nl'    # The remote host
PORT = 50007              # The same port as used by the server
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
s.send('Hello, world')
data = s.recv(1024)
s.close()
print 'Received', repr(data)
Lokal klappt das ganze auch. Aber sobald ich wirklich Daten über das Internet senden will kommt folgende Fehlermeldung:

Code: Alles auswählen

[Errno 10060] Ein Verbindungsversuch ist fehlgeschlagen, da die Gegenstel
le nach einer bestimmten Zeitspanne nicht richtig reagiert hat, oder die hergest
ellte Verbindung war fehlerhaft, da der verbundene Host nicht reagiert hat
Da ich dachte, ich habe in der Implementation irgendwas falsch gemacht, haben wir das ganze mit GENAU dem, von der Dokumentation angegebenen, Beispiel probiert. Resultat: selber Fehler. Es ist definitiv kein Problem bezüglich falscher IP Adresse oder Firewall etc. Wenn sogar das Beispiel der Dokumentation nicht funktioniert, was soll ich da noch machen? Hat jemand ne Idee?
mfg

Thomas :-)
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Sonntag 16. Januar 2011, 18:11

Sicher, dass da kein Router o.ä. dazwischen ist, der blockieren könnte?
Python 47
User
Beiträge: 574
Registriert: Samstag 17. September 2005, 21:04

Sonntag 16. Januar 2011, 21:56

Nein, denn es funktioniert mit UDP ohne Problme. Wir haben mal wireshark laufen lassen und das Problem ist, dass der 3-Way Handshake nie bis zum Ende durchgeführt wird. :(
mfg

Thomas :-)
BlackJack

Sonntag 16. Januar 2011, 22:00

@Python 47: Die Begründung verstehe ich nicht so ganz -- wenn UDP funktioniert heisst das ja nicht automatisch dass da keine Firewall dazwischen steht, die TCP blocken kann.

Wenn so einfache, grundlegende Sachen nicht funktionieren liegt das eher an der Netzwerkkonfiguration als an Python. Das benutzt ja auch nur die Socket-Implementierung des Systems.
Python 47
User
Beiträge: 574
Registriert: Samstag 17. September 2005, 21:04

Montag 17. Januar 2011, 17:17

Für mich klingt es unlogisch, dass TCP blockiert wird...UDP allerdings nicht. Und wenn ich mich recht entsinne hatte ich genau dasselbe Problem schon vor 2 Jahren mit vollkommen anderen Rechnern. Da war es aber nicht unbedingt das Problem auf UDP umzusteigen.

Hier hab ich das Problem, dass die max. Paketgröße bei UDP 64 Kbyte ist. Wenn ich also ne 2mb große Datei übertragen will muss ich diese in 64kbyte Blöcke splitten, verschlüsseln, drüben die einzelnen Blöcke wieder entschlüsseln und zusammensetzen. Das ist a) unschön b) viel Aufwand c) Performancemäßig schlecht. Abgesehen davon, dass UDP Übertragungsfehler ignoriert.

Hat denn hier jemand schonmal TCP Sockets erfolgreich eingesetzt?
mfg

Thomas :-)
BlackJack

Montag 17. Januar 2011, 17:27

@Python 47: UDP sendet ein Paket von A nach B. Bei TCP muss nicht nur A sich mit B verbinden, sondern B auch antworten können. Wenn B nun so konfiguriert ist, dass er keine Antwort zurück lässt, dann kann UDP funktionieren und TCP eben nicht. Für A sieht dass dann so aus, als wenn B nicht reagiert. Und nun schau Dir noch einmal die Fehlermeldung an.

Der Umstand, dass es bei Dir in anderen Konstellationen klappt und das andere natürlich auch schon erfolgreich TCP mit Python verwendet haben, legt wirklich nahe, dass es weder an Python noch an der Socket-Implementierung, sondern an der Netzwerkkonfiguration liegt.
Antworten