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
socket.accept abbrechen
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.
... 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.
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.
-
- User
- Beiträge: 773
- Registriert: Mittwoch 5. November 2003, 18:06
- Wohnort: Schweiz
- Kontaktdaten:
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.
Gruss
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()