Соединение идентифицируется 4-мя кортежами ((исходный ip, исходный порт), (целевой ip, целевой порт)), и исходный и целевой порты могут быть одинаковыми без каких-либо проблем.Это соединение могло бы даже быть установлено одним процессом, что привело бы к выводу, который вы видите.
Однако я только что получил неприятную ошибку, когда клиентский сокет пытался подключиться к серверному сокетус номером порта в эфемерном диапазоне портов на той же машине.Операция подключения будет повторяться до тех пор, пока она не будет успешной.
Проблема повторной попытки заключалась в том, что если приложение сервера не работало И исходный порт, выбранный случайным образом, совпадал с целевым портом (которыйвозможно, потому что целевой порт находился в эфемерном диапазоне), клиентский сокет СОЕДИНЯЕТСЯ С СЕБЕ (который наносит ущерб внутренней логике клиентского приложения, вы можете себе представить).
Поскольку клиент выполнялповторяется как можно быстрее, вероятность того, что это может произойти, составляет 1 к 30 000.
Следующий скрипт Python воспроизводит его:
import socket
host = 'localhost'
port = 35911
ctr = 0
while True:
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(5)
ctr += 1
s.connect((host, port))
print "Connected to self after", ctr, "tries"
break
except socket.error, e:
print e
# Retry