Python TCP-сокет при подключении OSError: [Errno 102] Операция не поддерживается в сокете - PullRequest
0 голосов
/ 04 апреля 2020

Я пытаюсь подключиться через TCP к сокету. У меня есть сокет UDP и TCP, созданный на одном и том же адресе хоста / порта и созданный так:

self.udp_socket = socket(AF_INET, SOCK_DGRAM)

self.udp_socket.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
self.udp_socket.bind((gethostname(), self.port))

self.tcp_socket = socket(AF_INET, SOCK_STREAM)
self.tcp_socket.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)

self.t_lock = threading.Condition()

# UDP THREAD
self.listen_udp_thread = threading.Thread(
    name="Listen UDP", target=self.listen_udp
)
self.listen_udp_thread.daemon = True
self.listen_udp_thread.start()

# TCP THREAD
self.listen_tcp_thread = threading.Thread(
    name="Listen TCP", target=self.listen_tcp
)
self.listen_tcp_thread.daemon = True
self.listen_tcp_thread.start()

Я слушаю сокет TCP следующим образом:

def listen_tcp(self):

    """Start listening for TCP connections"""
    self.tcp_socket.bind((gethostname(), self.port))
    self.tcp_socket.listen()
    print("TCP socket is listening...")

    while True:
        # Listen for TCP data
        conn, addr = self.tcp_socket.accept()  # accept connections
        if conn:
            print(f"Connected to {addr}")

        while True:
            with self.t_lock:
                data = conn.recv(2048)
                if not data:
                    self.t_lock.notify()
                    break  # this will close the connection
                print("TCP:", data)
                conn.send(data)

        conn.close()  # closes once connection broken

И затем я отправляю данные на тот же сокет TCP, как это:

def send_tcp(self, message, node_id, addr=None):

    """Wrapper function to send message and print to stdout"""

    if node_id is not None:
        addr = (gethostname(), self._id_to_port(node_id))

    with self.t_lock:
        self.print_out(message, addr)

        try:
            self.tcp_socket.connect(addr)
        except ConnectionRefusedError:
            print(
                f"> {bcolors.FAIL}Connection to {addr[0]}:{addr[1]} refused!{bcolors.ENDC}"
            )
        else:
            while True:
                self.tcp_socket.send(message.encode())
                response = self.tcp_socket.recv(2048)
                self.print_in("TCP RESPONSE: " + response, addr)
                if not response:
                    break

            self.tcp_socket.close()

        self.t_lock.notify()

Однако, когда я отправляю сообщение по TCP (invoke send_tcp()), я получаю сообщение об ошибке: OSError: [Errno 102] Operation not supported on socket

тот же t_lock также используется в приемнике / отправителе UDP. Я могу получать / отправлять UDP-запросы между «узлами» (как в моем случае называется класс).

Любая помощь приветствуется!

...