如果其中一個套接字阻塞Send(),它可能會影響其他客戶端。我很擔心:Send()是否等待「已交付」答案?如果它不是遠程客戶端可以通過忽略傳入數據包來阻止我的服務器事件處理循環 - 那麼我應該使用BeginSend。但我已經測量過BeginSend吃更多的CPU。所以我想知道天氣是否可以在服務器事件循環中使用阻塞發送?我可以在服務器環路中使用阻塞TCP Socket.Send嗎?
正如MSDN指出
一個發送成功完成並不表示該數據已成功傳遞。
我知道socket的發送緩衝區填滿時也可以阻塞。
'但我測量過BeginSend吃更多的CPU'我想看看你如何衡量它。 –
我在我的網絡引擎負載測試中替換了用BeginSend發送來檢查它。 2000個客戶端每200毫秒發送和接收一個數據包,同時服務器同時向它們發送隨機數據包(以模擬n^n個小的相關集負載)。發送顯示14-15%的服務器CPU負載,BeginSend顯示17-18%。對不起,我無法向您發送我的網絡代碼,因爲它非常龐大而且很複雜。:) – Vlad
@LB您可能認爲3-4%不是一個可感知的開銷,但服務器是一個關鍵性能的應用程序,我想讓它儘可能快。 – Vlad