Мой код выглядит следующим образом:
Код: Выделить всё
import socket
import time
# Server details
HOST = 'localhost' # The server's hostname or IP address
PORT = 34040 # The port used by the server
# Retry interval in seconds
RETRY_INTERVAL = 0.1 # 100 milliseconds
def try_connect():
i = 0
while True:
i += 1
try:
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect((HOST, PORT))
print(f"Connected to {HOST}:{PORT}")
# If you want to do something after connecting, add the code here
break # Exit the loop if connection is successful
except ConnectionRefusedError:
print(f"Connection failed, retrying in {RETRY_INTERVAL * 1000}ms, iteration {i}")
time.sleep(RETRY_INTERVAL)
if __name__ == "__main__":
try_connect()
Цикл будет выполняться до тех пор, пока сервер не привяжет порт.
К сожалению, в этой ситуации примерно через 15-20 минут скрипт способен установить соединение:
Код: Выделить всё
Connection failed, retrying in 100.0ms, iteration 14113
Connection failed, retrying in 100.0ms, iteration 14114
Connection failed, retrying in 100.0ms, iteration 14115
Connected to localhost:34040
Код: Выделить всё
user@linux:~$ sudo lsof -i :34040
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
python 3738 root 47u IPv4 19139 0t0 TCP linux:34040->linux:34040 (ESTABLISHED)
Код: Выделить всё
netstat -ntcpav | grep 'localhost:34040'
Это результат выполнения этих команд
Я также пробовал разные порты, но проблема все еще возникает (8080, 33000). Кроме того, увеличение RETRY_INTERVAL, похоже, усложняет воспроизведение проблемы: если при 100 мс это занимало в среднем менее 20 минут, при 500 мс — чуть меньше часа.
Моя машина — это Версия ядра Linux 4.9.224 aarch64, но это также воспроизводится на виртуальных машинах 5.4.0-176 x86_64 и 6.1.46 x86_64.
Я ищу информацию о том, почему происходит это неожиданное соединение . Будем очень признательны за любые советы о дальнейших шагах по диагностике или решению этой проблемы.
Изменить:
Также журнал tcpdump:
Код: Выделить всё
14:31:33.399814 IP localhost.34026 > localhost.34030: Flags [S], seq 897561866, win 65495, options [mss 65495,sackOK,TS val 2043122074 ecr 0,nop,wscale 7], length 0
14:31:33.399816 IP localhost.34030 > localhost.34026: Flags [R.], seq 0, ack 242264763, win 0, length 0
14:31:33.499948 IP localhost.34030 > localhost.34030: Flags [S], seq 2164477081, win 65495, options [mss 65495,sackOK,TS val 2043122174 ecr 0,nop,wscale 7], length 0
14:31:33.499952 IP localhost.34030 > localhost.34030: Flags [S.], seq 2164477081, ack 2164477082, win 65495, options [mss 65495,sackOK,TS val 2043122174 ecr 2043122174,nop,wscale 7], length 0
14:31:33.499954 IP localhost.34030 > localhost.34030: Flags [.], ack 1, win 512, options [nop,nop,TS val 2043122174 ecr 2043122174], length 0
14:31:33.499973 IP localhost.34030 > localhost.34030: Flags [F.], seq 1, ack 1, win 512, options [nop,nop,TS val 2043122174 ecr 2043122174], length 0
14:31:33.499976 IP localhost.34030 > localhost.34030: Flags [.], ack 2, win 512, options [nop,nop,TS val 2043122174 ecr 2043122174], length 0
Подробнее здесь: https://stackoverflow.com/questions/786 ... g-the-port