2014-02-10 100 views
0

如果其中一個套接字阻塞Send(),它可能會影響其他客戶端。我很擔心:Send()是否等待「已交付」答案?如果它不是遠程客戶端可以通過忽略傳入數據包來阻止我的服務器事件處理循環 - 那麼我應該使用BeginSend。但我已經測量過BeginSend吃更多的CPU。所以我想知道天氣是否可以在服務器事件循環中使用阻塞發送?我可以在服務器環路中使用阻塞TCP Socket.Send嗎?

正如MSDN指出

一個發送成功完成並不表示該數據已成功傳遞。

我知道socket的發送緩衝區填滿時也可以阻塞。

+1

'但我測量過BeginSend吃更多的CPU'我想看看你如何衡量它。 –

+0

我在我的網絡引擎負載測試中替換了用BeginSend發送來檢查它。 2000個客戶端每200毫秒發送和接收一個數據包,同時服務器同時向它們發送隨機數據包(以模擬n^n個小的相關集負載)。發送顯示14-15%的服務器CPU負載,BeginSend顯示17-18%。對不起,我無法向您發送我的網絡代碼,因爲它非常龐大而且很複雜。:) – Vlad

+0

@LB您可能認爲3-4%不是一個可感知的開銷,但服務器是一個關鍵性能的應用程序,我想讓它儘可能快。 – Vlad

回答

1

如果其中一個套接字阻塞Send(),它可能會影響其他客戶端。

僅當您的服務器是單線程時。解決方案:多線程。

我很擔心:Send()是否等待「已傳遞」答案?

不,但它可以阻止客戶端沒有讀取和緩衝區填滿。

如果是遠程客戶端可以通過忽略傳入數據包來阻止我的服務器事件處理循環 - 那麼我應該使用BeginSend。但我已經測量過BeginSend吃更多的CPU。所以我想知道天氣是否可以在服務器事件循環中使用阻塞發送?

不,它不是。如果你能克服厭惡,使用多線程或非阻塞I/O或異步I/O。你對3-4%開銷的建議聽起來不合適。

+0

「它可以阻止客戶端沒有閱讀」 - 你能提供更多的信息在這? – Vlad

+0

我已經**使用異步IO接收。什麼「厭惡」?我使用多線程,但是我看它執行的速度有多快,並且在單線程更適合或其他優化的地方進行了改進。如果你沒有像這樣優化你的網絡核心,你甚至無法達到200個客戶端的實時網絡遊戲限制。每個百分比都很重要。 – Vlad

+1

@Vlad我從你的問題和意見中瞭解到,你並沒有問任何問題,但期待你的方法得到批准。對不起,我不這麼認爲。 「 –

相關問題