Seite 1 von 1
socket.accept abbrechen
Verfasst: Montag 26. Februar 2007, 18:37
von cime
Hi, ich habe in einem Programm socket.accept() aufgerufen und moechte dieses von einem anderen thread aus abbrechen ... weiss jemand, wie ich so etwas realisieren kann?? ich habe schon ueberlegt, einfach auf dieses socket selber mit nem neuen socket zu verbinden und danach die Verbindung abzubrechen ... allerdings ist diese Loesung nicht sehr elegant ...
MfG
cime
PS: nicht crime, weil manchmal leute das verwechseln
Verfasst: Montag 26. Februar 2007, 19:43
von BlackJack
Ich glaube ich würde es so ähnlich machen. Vielleicht nicht einfach nur die Verbindung abbrechen, sondern irgend etwas senden, was der Empfängerthread eindeutig als Aufforderung zum Abbruch interpretiert. Damit man einen "Fehlversuch" vom Abbruchwunsch unterscheiden kann.
Verfasst: Mittwoch 28. Februar 2007, 13:44
von cime
na okay, dann werde ich das so machen ... etwas senden brauche ich nicht, weil ich eine Variable vorher so setzen, dass er weiss, dass er abbrechen soll ... trotzdem Danke
cime
Verfasst: Mittwoch 28. Februar 2007, 14:36
von Masaru
Spräche etwas gegen ein
threading.
Event() Objekt? Im Empfänger Thread könnte man auf
.isSet() abfragen und den Socket schließen, falls eine Setzung mit
.set() im Trigger-Thread erfolgt ist.
Verfasst: Mittwoch 28. Februar 2007, 15:35
von BlackJack
Dagegen spräche das der Empfänger nicht testen kann weil `accept()` blockiert.
Verfasst: Mittwoch 28. Februar 2007, 17:22
von Masaru
... das ist natürlich unglücklich *g*. Stimmt, dass spricht sehr wohl dagegen.
Muss man wohl doch ein Abbruch-Signal auf den Port schicken, denn ein einfacher Versuch, einen Socket auf den Port neu zu binden könnte zu einem "Adress already in use" socket Fehler führen.
Verfasst: Mittwoch 28. Februar 2007, 18:56
von rayo
Hi
Du kannst einfach mit dem Modul select arbeiten, das blockiert auch solange nichts passiert, jedoch geht es weiter wenn der Socket geschlossen wird, einfach beim nächsten Accept gibt es dann eine exception.
Code: Alles auswählen
import socket
import thread
import time
import select
#Serversocket erstellen
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind( ('127.0.0.1',9876) )
s.listen(5)
#accept im Thread
def accept(s):
while 1:
r,w,e = select.select([s],[],[])
if r:
try:
sock, adr = s.accept()
except socket.error, ex:
if ex.args[0] == 9:
#Bad filedescriptor -> socket.closed
print "closed"
return
else:
#Anderer Fehler -> reraise
raise
#Verbindung angenommen
print adr, sock
thread.start_new_thread(accept, (s,))
raw_input()
#Clientverbindung
b = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
b.connect( ('127.0.0.1', 9876) )
b.send("asdlfnasdf")
b.close()
raw_input()
#Serversocket schliessen
s.close()
Gruss