假設下面的代碼:創建一個插口,可以同時服務的併發請求
Task.Run(()=>{
while(true){
Socket connection = socket.Accept(); // Problem
Task.Run(()=> { //Receive from and Send to connection })
}
})
雖然它能夠在一個多線程的方式提供服務的連接,所有的請求都提供了一個又一個,而不是在一個完全因爲socket.Accept()
在while循環中,所以是併發方式。另一方面,它不能被轉移到內部任務中,因爲它將會創建一個無限的(非常大且未知的)數量。
這個問題的正確解決方案是什麼?
例子:
Connection A -- Accepted at 3:30:00:00 PM
Connection B -- Accepted at 3:30:00:00 PM
Instead of
Connection A -- Accepted at 3:30:00:00 PM
Connection B -- Accepted at 3:30:00:50 PM
你應該有多個套接字來調用accept。 – VuVirt
@VuVirt:多個套接字?那麼多少?不,這不是解決方案。一個愚蠢的人可以僞造這樣的事情。 – Arrrr
你應該爲每個新的連接創建一個新的套接字,並保留原來的套接字來監聽新的連接 – mousetail