Why is endpoint already connected when running mutiple processes

180 Views Asked by At

I am running the following client:

import socket
import Utility
import os.path
import time

def tolength(str, replacement, length):
    return str + (replacement * (length - len(str)))

class Requester:
    def __init__(self):
        self.address = "/tmp/device-web-serverinterface.socket"
        try:
            self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
        except:
            print("Failed")
           #raise Exception("The connection could not be established.")

    def ask(self):
        self.sock.connect(self.address)
        self.sock.sendall(tolength("DO UNIX-Terminal -1", " ", 2048).encode())
       self.sock.recv(2048)
        self.sock.close()
        self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)

def main():
  r = Requester()
  while True:
    r.ask()
    time.sleep(10)

main()

in more than one instance. (With one instance everything works fine) and the following Server (once):

import threading
import socket
import os


class ListenerThread(threading.Thread):

    def __init__(self):
        threading.Thread.__init__(self)
        self.adress = "/tmp/device-web-serverinterface.socket"
        if os.path.exists(self.adress):
            os.remove(self.adress)

    def run(self):
        self.bindsocket = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
        self.bindsocket.bind(self.adress)
        self.bindsocket.listen(100)

        while True:
            newsocket, addr = self.bindsocket.accept()
            print("Accepted")
            string = newsocket.recv(2048).decode()
            //Edited for better Use
            br = "BAD REQUEST"
            newsocket.sendall((br + " "*(2048-len(br))).encode())
            newsocket.close()

def main():
   l = ListenerThread()
   l.run()

main()

when running the client I almost certainly get the error below after the second execute. I cannot decide which process to run (uwsgi) :

Mär 25 17:44:50 ******.stratoserver.net uwsgi[2724]:   File "/usr/local/lib/python3.6/dist-packages/flask/app.py", line 1936, in dispatch_request
Mär 25 17:44:50 ******.stratoserver.net uwsgi[2724]:     return self.view_functions[rule.endpoint](**req.view_args)
Mär 25 17:44:50 ******.stratoserver.net uwsgi[2724]:   File "/usr/local/lib/python3.6/dist-packages/flask_login/utils.py", line 272, in decorated_view
Mär 25 17:44:50 ******.stratoserver.net uwsgi[2724]:     return func(*args, **kwargs)
Mär 25 17:44:50 ******.stratoserver.net uwsgi[2724]:   File "./main.py", line 36, in device_post
Mär 25 17:44:50 ******.stratoserver.net uwsgi[2724]:     return render_template('devices.html', message = devicecommunicator.ask())
Mär 25 17:44:50 ******.stratoserver.net uwsgi[2724]:   File "./DeviceServerRequester.py", line 22, in ask
Mär 25 17:44:50 ******.stratoserver.net uwsgi[2724]:     self.sock.connect(self.address)
Mär 25 17:44:50 ******.stratoserver.net uwsgi[2724]: OSError: [Errno 106] Transport endpoint is already connected

This makes no sense to the depth of my knowledge.

Edit: If I run this under MacOS I get the following Exception:

Traceback (most recent call last):
  File "DeviceServerRequester.py", line 38, in <module>
    main()
  File "DeviceServerRequester.py", line 35, in main
    r.ask()
  File "DeviceServerRequester.py", line 20, in ask
    self.sock.connect(self.address)
OSError: [Errno 9] Bad file descriptor

within the Client Code.

0

There are 0 best solutions below