2016-05-03 40 views
1

假設我有一個基本的C#套接字服務器。c#套接字檢查傳入連接並且一次只接受一個連接

TcpListener listener = new TcpListener(8888); 
listener.Start(); 

Socket clientSocket = listener.AcceptSocket(); 

這將接受來自客戶端的第一個連接。

但是,假設我們有10個傳入連接。我不希望接受全部10個連接,我想列出所有未決連接,並選擇一個連接,我將接受並與其交換數據 - 我們可以假設我可以通過其IP地址識別它們。交換完成後,我將關閉套接字並選擇不同的連接來交換數據。
我不需要有超過1個活動連接,因爲我一次只能服務一個客戶端。

這樣的壯舉可能嗎?或者我是否必須接受所有這些方法,並通過他們來解決問題?

編輯:客戶端超時不是一個問題。客戶端編程爲在超時情況下定期重試連接。

EDIT2:
我設法相當多的搜索後發現了類似的問題。看起來你不能區分客戶,直到你接受他們的連接。這裏的問題:
How to reject a connection attempt in c#?
我想我至少可以告訴連接企圖來自哪個IP地址,但它似乎是不可能的,直到我連接到客戶端。看起來我畢竟會穿過客戶端。

+0

您可以通過接受然後關閉連接來完成此操作,但如果您無法及時找到,等待的連接最終會超時。 – nhouser9

+0

@ nhouser9客戶端被編程爲在超時後重試連接嘗試,所以這對我來說不是問題。我將編輯這個問題來澄清。 – xIcarus

+0

然後除了性能之外沒有真正的問題 - 如果服務器執行冗長的計算,您的客戶可能會等待相當長的一段時間。但是,否則,沒有任何東西阻止您接受連接,關閉連接並接受新的連接。 – nhouser9

回答

0

您不接受所有連接,只有一個。您只需執行AcceptSocket,處理您的客戶端,然後斷開並接受另一個客戶端,例如在while(listener.Pending())循環中。

+0

是的,但是這讓我無法控制與我交互的客戶端。如果不是我想要的客戶端,我可以接受連接並將其關閉,但是這可能會導致同一臺計算機反覆連接的嚴重問題。爲了讓你明白,這些客戶端是我的機器,正在等待我與他們交換數據。我想一次發送一條指令給他們。機器知道我的IP,我不知道他們的IP,我不能保證他們的路由器讓他們充當服務器(端口轉發或DMZ)。這就是爲什麼我需要成爲服務器,他們需要成爲客戶。 – xIcarus

+0

「不是你想要的客戶」什麼阻止你在客戶端連接時爲客戶提供服務? – Adrian

+0

事實上,我不需要剛剛連接的客戶端。如果我沒有把我的問題弄清楚,我非常抱歉。看 - 一個正常的方法是接受所有10個客戶端(從我的例子),並寫入其中的一個。就像一個信使,但只在客戶端和服務器之間。我問是否有可能避免維護這10個併發連接,並接受其中的一個 - 我需要的客戶端(機器)。 – xIcarus