連接是由一個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
那是奇怪了,從來沒有見過這樣的事。 – Jack 2010-10-26 06:41:54