2016-01-31 31 views
0

我想寫一個可以在一個線程中處理多個客戶端的tcp服務器。我真的想堅持一個線程,即使沒有隱藏的C#異步線程,所以我想使用Socket.Select而不是使用異步接收/發送方法。C#Socket.Select and writes

在閱讀Select的文檔時,我想知道select如何告訴我它可以發送多少個字節而沒有阻塞。它的文檔說明如下:

如果您已經建立了連接,則可寫性意味着所有發送操作都會成功而不會阻塞。

所以根據文檔,似乎我可以發出一個巨大的發送操作,它會成功沒有阻塞。但是,如果我發送100兆字節的發送操作,這是如何工作的。當然,套接字的寫入緩衝區不能包含那麼多的數據,所以套接字必須阻塞或只寫入一小部分數據。這個套接字在這裏做什麼?

+0

'我確實想堅持一個線程,甚至沒有隱藏的C#異步線程** ** []沒有線程(http:// blog。 stephencleary.com/2013/11/there-is-no-thread.html) – Eser

+0

@Eser:然後簡單地忘記我的動機段落,但我仍然對這個問題的答案感興趣。 – gexicide

回答

1

假設你使用非阻塞套接字Send將只發送它可以緩衝的字節。它的返回值將是它實際發送的字節數。從發送的文檔

直:

在非阻塞模式下,可以發送成功完成,即使它發出比你要求的字節數 少。應用程序的 責任用於跟蹤發送的字節數並重試 操作,直到應用程序發送請求的 字節數。

+0

因此,只有當所有使用的套接字都設置爲非阻塞模式時,才使用'Select'纔是正確的? – gexicide

+0

'Select'對阻塞套接字可以正常工作,但是它通常不會完成。 – shf301

0

如果你不想多線程,我認爲這個項目會有所幫助: http://www.codeproject.com/Articles/488668/Csharp-NET-TCP-Server

作者提出瞭解決方案,它允許多個客戶端在一個TCP服務器套接字2個線程,無論數量連接客戶端。

希望它有幫助!


除非你想要做的一切只是在單個線程,包括應用程序邏輯,然後......不這樣做:)

有趣的事實: 在Android中(因爲API級別11)你無法在主線程中使用網絡操作創建應用程序,因爲應用程序將在啓動NetworkOnMainThreadException後立即崩潰。我認爲這顯示了情況的嚴重性;)