socket.accept abbrechen

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
cime
User
Beiträge: 152
Registriert: Dienstag 24. Mai 2005, 15:49

socket.accept abbrechen

Beitragvon cime » Montag 26. Februar 2007, 18:37

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
BlackJack

Beitragvon BlackJack » Montag 26. Februar 2007, 19:43

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.
cime
User
Beiträge: 152
Registriert: Dienstag 24. Mai 2005, 15:49

Beitragvon cime » Mittwoch 28. Februar 2007, 13:44

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
Benutzeravatar
Masaru
User
Beiträge: 425
Registriert: Mittwoch 4. August 2004, 22:17

Beitragvon Masaru » Mittwoch 28. Februar 2007, 14:36

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.
BlackJack

Beitragvon BlackJack » Mittwoch 28. Februar 2007, 15:35

Dagegen spräche das der Empfänger nicht testen kann weil `accept()` blockiert.
Benutzeravatar
Masaru
User
Beiträge: 425
Registriert: Mittwoch 4. August 2004, 22:17

Beitragvon Masaru » Mittwoch 28. Februar 2007, 17:22

... 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.
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Beitragvon rayo » Mittwoch 28. Februar 2007, 18:56

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

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder