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