Я пытаюсь подключиться через 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-запросы между «узлами» (как в моем случае называется класс).
Любая помощь приветствуется!