ConnectionResetError

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
m.g.o.d
User
Beiträge: 75
Registriert: Samstag 4. April 2020, 13:17

Hi Zusammen,

ich würde mal eure Hilfe brauchen. Aktuell versuche ich auf einem Server, ein kleines Python Tool zu schreiben, was ständig auf ankommende Anfragen meiner Client(s) wartet und dann angibt, ob ein bestimmtest Programm läuft (return True, else False). Das klappt aktuell nur einmal, danach kommt der Fehler: ConnectionResetError: [WinError 10054] An existing connection was forcibly closed by the remote host

Nun möchte ich es eigentlich so haben, dass ein Client zu jeder Zeit eine Verbindung aufbauen kann und den Status abfragen kann. Ich habe bereits die s.close() Anweisungen aus den Quellcodes genommen, die aktuell so ausschen:

Serverseite:

Code: Alles auswählen

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(("", 50000))
s.listen(1)


while True:
    komm, addr = s.accept() 
        
    while True:
            
        data = komm.recv(1024)
        if not data:
            print("no data")
            komm.close() 
            break 
        print("[{}] {}".format(addr[0], data.decode()))

        # Check, if GAM is running. Return boolTrue / False
        status = "mainframe.exe" in (p.name() for p in psutil.process_iter())
            
        
        komm.send(str(status).encode())
Clientseite:

Code: Alles auswählen

    def init_socket(self):
        """ Only create one instance and return error, if no connection possible"""
        if self.create_instance_socket == True:
            try:
                self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
                self.s.connect(('ip_des_servers', 50000))
                self.create_instance_socket = False
            except ConnectionRefusedError:
                self.create_instance_socket = True
                
            
    @pyqtSlot()
    def run(self):
     
        while True:

            try:
                self.init_socket()
                nachricht = "test von mir"
                self.s.send(nachricht.encode())
                    
                status_recieved = self.s.recv(1024)
                print(status_recieved)
                print("[{}] {}".format('ip_des_servers', status_recieved.decode()))
                    
            except OSError as o:
                self.status.emit("No connection to target machine")
Wie gesagt, wenn ich die App erst auf dem Server starte, danach auf dem Client, dann gehts. Mein Wunsch wäre aber, dass der Server 24/7 läuft und die Clients sich zu jeder Zeit den Status dort abholen dürfen. Könntet ihr mir sagen, was ich ändern müsste, damit das so hinhaut? Bin noch nicht sooo versiert mit der socket library.

Vielen Dank schonmal :-)
__deets__
User
Beiträge: 14535
Registriert: Mittwoch 14. Oktober 2015, 14:29

Auf die socket library verzichten und stattdessen mit einer HTTP Server Library/Framework wie Flask, bottle oder den schon eingebauten arbeiten. Denn da sind alle socket Probleme schon gelöst, ein Protokoll ist auch vorhanden, mehrere Clients können sich verbinden, etc pp.
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

Deine Socket-Programmierung ist fehlerhaft. `recv` muß auch damit zurechtkommen, dass bei jedem Aufruf nur ein Byte gelesen wird und send muß damit zurechtkommen, dass nur ein Byte gesendet wird. `data` wird gar nicht wirklich verwendet. Um sich den ganzen Aufwand zu sparen, das sauber zu programmieren, sollte man immer socket.makefile benutzen.

Ansonsten zeigt der gezeigt Code nicht den behaupteten Fehler.
Antworten