Seite 1 von 1

Port nach Socket close immernoch belegt

Verfasst: Mittwoch 22. Januar 2014, 20:50
von audacity363
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?

Re: Port nach Socket close immernoch belegt

Verfasst: Mittwoch 22. Januar 2014, 21:03
von Sirius3
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)

Re: Port nach Socket close immernoch belegt

Verfasst: Mittwoch 22. Januar 2014, 21:05
von audacity363
Okey Danke gut zu wissen. Nun bekomme ich einen AttributeError:
type object '_socketobject' has no attribute 'SOL_SOCKET'

Re: Port nach Socket close immernoch belegt

Verfasst: Mittwoch 22. Januar 2014, 21:10
von Sirius3
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.

Re: Port nach Socket close immernoch belegt

Verfasst: Mittwoch 22. Januar 2014, 21:19
von 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.

Re: Port nach Socket close immernoch belegt

Verfasst: Mittwoch 22. Januar 2014, 21:21
von audacity363
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.

Re: Port nach Socket close immernoch belegt

Verfasst: Mittwoch 22. Januar 2014, 21:35
von BlackJack
@audacity363: Erklär mal was der ``as socket``-Teil bewirkt.

Re: Port nach Socket close immernoch belegt

Verfasst: Donnerstag 23. Januar 2014, 08:32
von audacity363
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.

Re: Port nach Socket close immernoch belegt

Verfasst: Donnerstag 23. Januar 2014, 08:45
von BlackJack
@audacity363: Und nun die zweite Frage: Unter welchem Namen wird das Modul importiert wenn man das ``as socket`` weg lässt? :-)

Re: Port nach Socket close immernoch belegt

Verfasst: Donnerstag 23. Januar 2014, 09:26
von audacity363
sch**** stimmt ja :D

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