Port nach Socket close immernoch belegt

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
audacity363
User
Beiträge: 83
Registriert: Dienstag 6. August 2013, 18:59

Guten Abend

ich habe seit längen das Problem, dass ich mein TCP Server nicht richtig beendet bekomme. Ich schließe den Socket zwar aber trotzdem ist der Port danach immer noch Belegt und ich kann den Server nicht wieder starten.
hier mal der Code:

Code: Alles auswählen


from socket import *
import sys, datetime, time
exit = None



def start():
    try:
        sockobj = socket()
        sockobj.bind(("", 6565))
        sockobj.listen(5)
    except Exception:
        error_log = open("error_log.log", "a")
        ts = time.time()
        error_log.write(str(datetime.datetime.fromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S')) + ": Server konnte nicht gestartet werden. Port schon belegt.\n")
        print "Port schon belegt"
        error_log.close()
        sys.exit(1)
    while True:
        global exit
         komm, address = sockobj.accept()
         data = komm.recv(1024)

        #data wird bearbeitet
        if data == 'exit':
            komm.send(".")
            exit = True
            print "erstes while"
            komm.close()
            break 
                
        komm.close()
        print('Verbindung geschlossen')
        if(exit == True):
            break
                  
    sockobj.close()
    print ("Server beendet")

Er gibt auch aus: Server beendet.

Hat jemand eine Idee woran es liegen könnte, oder sehe ich gerade den Wald vor lauter Bäumen nicht mehr?
Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

Das von Dir beschriebene Problem ist ein ganz normales Verhalten. Ein Port ist noch für eine gewisse Weile gesperrt, nachdem er geschlossen wurde, um noch ausstehenden Verbindungen eine Fehlermeldung schicken zu können. Wenn Du dies nicht willst, mußt Du das dem Betriebssystem mitteilen:

Code: Alles auswählen

sockobj.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
audacity363
User
Beiträge: 83
Registriert: Dienstag 6. August 2013, 18:59

Okey Danke gut zu wissen. Nun bekomme ich einen AttributeError:
type object '_socketobject' has no attribute 'SOL_SOCKET'
Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

Ich habe Deinen Sternchenimport von "socket" übersehen. Ein Sternchenimport ist sowieso keine gute Idee, weil man keinen Einfluß darauf hat, welche Namen in den eigenen Namespace wandern.
BlackJack

@audacity363: Als nächstes könnte man dann mal das ``global`` loswerden und das Programm ist fehlerhaft weil ein `recv()` nicht garantiert wie viel von dem TCP-Datenstrom gelesen wird. Wenn Dein Code nicht damit klar käme das jeder Buchstabe von dem 'exit' einen eigenen `recv()`-Aufruf benötigt, dann ist er nicht robust genug.
audacity363
User
Beiträge: 83
Registriert: Dienstag 6. August 2013, 18:59

Okey Danke habe es jetzt einfach so gemacht:

Code: Alles auswählen

import socket as socket
Natürlich den Code dadurch angepasst. Wie so ein paar Wörtchen das ganze Programm ändern können.
Schönen Abend noch.
BlackJack

@audacity363: Erklär mal was der ``as socket``-Teil bewirkt.
audacity363
User
Beiträge: 83
Registriert: Dienstag 6. August 2013, 18:59

Das Paket socket wird mit dem Namen socket importiert.
Man hätte es auch "blabla" nennen können, nur dann muss man seine Verweise auf die Library natürlich ändern.
BlackJack

@audacity363: Und nun die zweite Frage: Unter welchem Namen wird das Modul importiert wenn man das ``as socket`` weg lässt? :-)
audacity363
User
Beiträge: 83
Registriert: Dienstag 6. August 2013, 18:59

sch**** stimmt ja :D

Ausrede: Gestern Abend war es spät und ich war übermüdet.
Antworten