如果我使用自動分配的臨時端口範圍(5000-65534)範圍內的端口連接到本地主機,我可以可靠地將Winsock套接字自動獲取到connect()
。特別是,Windows似乎有一個系統範圍的滾動端口號,它是下一個將嘗試分配爲客戶端套接字的本地端口號的端口。如果我創建套接字直到分配的數字低於我的目標端口號,然後重複創建一個套接字並嘗試連接到該端口號,我通常可以讓套接字連接到它自己。爲什麼套接字連接()到它自己的臨時端口?
我第一次發現它在一個應用程序中反覆嘗試連接到本地主機上的某個端口,並且當服務沒有監聽時,它很少成功地建立連接並接收它最初發送的消息(發生這種情況成爲Redis PING
命令)。
一個例子,在Python(什麼也沒有聽目標端口上運行):
import socket
TARGET_PORT = 49400
def mksocket():
return socket.socket(socket.AF_INET, socket.SOCK_STREAM, socket.IPPROTO_TCP)
while True:
sock = mksocket()
sock.bind(('127.0.0.1', 0))
host, port = sock.getsockname()
if port > TARGET_PORT - 10 and port < TARGET_PORT:
break
print port
while port < TARGET_PORT:
sock = mksocket()
err = None
try:
sock.connect(('127.0.0.1', TARGET_PORT))
except socket.error, e:
err = e
host, port = sock.getsockname()
if err:
print 'Unable to connect to port %d, used local port %d: %s' % (TARGET_PORT, port, err)
else:
print 'Connected to port %d, used local port %d' (TARGET_PORT, port)
在我的Mac機,這最終與Unable to connect to port 49400, used local port 49400
終止。在我的Windows 7機器上,連接成功建立並打印Connected to port 49400, used local port 49400
。生成的套接字接收發送給它的任何數據。
這是Winsock中的錯誤嗎?這是我的代碼中的錯誤?
編輯:這裏是所示的TcpView違例的連接截圖:
這裏有一些相關的問題:http://stackoverflow.com/questions/4949858/how-can-you-have-a-tcp-connection-back-to-the-same-port http:// stackoverflow。 com/questions/5139808/tcp-simultaneous-open-and-self-connect-prevention –
我在我的系統中定期發生這個問題,它涉及至少五個本地端口,服務器可能運行或不運行,客戶不斷嘗試連接。我無法想到在連接層面以獨立於平臺的方式解決這個問題。 –