Absturz bei accept() / recv()

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Schandbube
User
Beiträge: 5
Registriert: Samstag 27. November 2010, 08:56

Hallo,

ich habe ein Problem mit den Sockets. Mein Betriebssystem ist eine Windows 7 64Bit Version. Python habe ich auf Version 2.6.4.

Hier ist erstmal mein Programmcode. Das ist der Echo Server aus dem Python Handbuch:

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()
Wenn ich das Programm laufen lasse hängt es sich immer an dieser Befehlszeile auf:

Code: Alles auswählen

conn, addr = s.accept()
Nun ist meine Frage woran das liegen könnte?

Ich habe das Programm bereits mit der 32-als auch mit der 64-Bit Version von Python ausprobiert. Auch auf meinem alten Windows XP Rechner hängt sich das Programm an der selben Stelle auf.

Dann habe ich einen UDP Server aus einem anderen Beispiel genommen.

Code: Alles auswählen

import socket 
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

s.bind(("localhost", 61542))
daten, addr = s.recvfrom(1024)

print "[%s] %s" % (addr[0], daten)
print daten
s.close()
Hier hängt er sich an dieser Befehlszeile auf:

Code: Alles auswählen

daten, addr = s.recvfrom(1024)
Außerdem habe ich versucht die beiden Server nicht blockierend laufen zu lassen. Dann kommt allerdings die Fehlermeldung, dass ein "nicht blockierender Prozess nicht sofort ausgeführt werden konnte".

Ich danke euch schonmal im voraus für die Antworten ;)

Grüße
Schandbube
BlackJack

Warum steht im Betreff "Absturz" und im Beitrag dann "aufhängen"? Definiere mal bitte "aufhängen"? Die betreffenden Zeilen blockieren so lange bis eine Verbindung angenommen wird bzw. Daten ankommen. Das ist normal und soll auch so sein.
Schandbube
User
Beiträge: 5
Registriert: Samstag 27. November 2010, 08:56

Ja stimmt, das ist ein wenig unklar. Also Python IDLE stürzt ab. Es geht einfach nicht weiter. Hier ist mal ein Bild von dem Problem

http://img833.imageshack.us/i/absturz.jpg

Um genau zu sein hängt sich Python erst auf und wenn ich dann in das IDLE Fenster klicke stürzt es dann komplett ab.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Das Programm stürzt nicht ab sondern wartet auf eingaben. Da dabei die GUI-Loop nicht durchlaufen wird meint Windows dass das Programm hängt.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Schandbube
User
Beiträge: 5
Registriert: Samstag 27. November 2010, 08:56

Ok, das kann sein. Aber dann bringt mich das gleich zum nächsten Problem: Wenn ich den Clienten laufen lasse gibt er mir immer das hier aus: "error: [Errno 10061] Es konnte keine Verbindung hergestellt werden, da der Zielcomputer die Verbindung verweigerte"

Der dazugehörige Code:

Code: Alles auswählen

# Echo client program
import socket

HOST = '192.168.178.36'    # The remote host
PORT = 50008              # 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)
Ich komme also hier nicht über den Befehl "s.connect((HOST, PORT))" hinweg.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Firewall?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Schandbube
User
Beiträge: 5
Registriert: Samstag 27. November 2010, 08:56

Ja, daran habe ich natürlich auch schon gedacht^^ Hab alles aus.

Ich hab jetzt auch mal ein fertiges Chatprogramm ausprobiert und das funktioniert komischerweise. Der Server meldet zwar immer noch "Keine Rückmeldung", funktioniert aber trotzdem.

Ich sehe auch auf den ersten Blick im Code, was die Netzwerkkommunikation, angeht keine großen Unterschiede.
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

Nach deinen Codeschnippseln da oben, nutzt du beim Server den Port 50007 und beim Client Port 50008.
Hast du das mal geändert, denn so Funktioniert das nicht ?
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
Schandbube
User
Beiträge: 5
Registriert: Samstag 27. November 2010, 08:56

Ok, jetzt bin ich buff. Erstmal vielen vielen Dank für die Hilfe :D

Das Programm funktioniert, wenn Client und Server beide den Port 8888 benutzen. Ich dachte immer, dass 2 Programme auf dem selben Rechner nicht den selben Port benutzen dürfen :shock:

Kann mir vielleicht jemand sagen, wieso das plötzlich mit dem Port 8888 funktioniert?

Als ich angefangen hatte mit den Beispielen herumzuprobieren habe ich beides mal den port 50007 benutzt. Da hat es nicht geklappt.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Der Client muss die Daten auf dem selben Port senden, auf dem der Server auch horcht. Woher soll man sonst unterscheiden, an welche Anwendung die Daten geschickt werden sollen? Lediglich zwei Server auf dem selben Port machen keinen Sinn.

Das es vorher mit identischen Ports nicht funktioniert hat lag mit Sicherheit an einem anderen Fehler.

Sebastian
Das Leben ist wie ein Tennisball.
Antworten