我在python中構建了客戶端 - 服務器體系結構,不幸的是,最初的設計是,每個到服務器的請求都由一個TCP連接表示,我必須發送大型組(20 000+)的請求,有時出現插座錯誤#10055
。WinSock錯誤#10055
我已經發現瞭如何處理它在python:
>>> errno.errorcode[10055]
'WSAENOBUFS'
>>> errno.WSAENOBUFS
10055
,並建立一個代碼,能夠處理錯誤,並重新連接(當然,很少有時間延遲給服務器的時間做不管它必須做):
class MyConnect:
# __init__ and send are not important here
def __enter__(self):
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# Try several reconnects
for i in range(0,100):
try:
self.sock.connect((self.address, self.port))
break
except socket.error as e:
if e.errno == errno.WSAENOBUFS:
time.sleep(1)
else:
raise
return self
def __exit__(self, type, value, traceback):
self.sock.close()
# Pseudocode
for i in range(0,20000):
with MyConnect(ip,port) as c:
c.send(i)
我的問題是:
- 沒有任何「好習慣「這樣做的方法?
- 是
e.errno == errno.WSAENOBUFS
多平臺?如果不是這樣,如何使它成爲多平臺?
注意:我在剛剛測試在Windows然而,我需要它在Linux上工作了。
你是說你需要同時擁有20000個TCP連接到同一個地址/端口嗎?你可能會首先用完臨時端口。你有沒有考慮過這個問題?設置最大連接數?順便說一句,你關閉了插座? –
「串行」你的意思是你有一次打開一個連接?這不是你在代碼中所擁有的。 –
@NikolaiNFetissov我已經編輯了我的問題(和nuked舊評論),現在你幾乎已經使用了我正在使用的確切代碼 – Vyktor