我寫的音頻流光(客戶端 - 服務器)礦山(C/C++)的項目, 和我決定線程UDP服務器這一個多項目。問題實現多線程UDP服務器(線程池?)
這背後的邏輯是,每個客戶端將在自己的線程來處理。 我遇到的問題是線程互相干擾。
我的服務器做的第一件事是創建一種線程池;它創建5個 線程,所有由recvfrom()
功能自動封鎖, 雖然看似是,在大多數時候我另一臺設備 連接到服務器,多個線程響應,後來 導致服務器時代完全阻止,不能進一步操作。
這是非常困難的,所以我在這裏寫爲了 獲得多線程UDP服務器是如何實現的,通常一些建議來調試這一點。
我應該使用一個互斥體或信號代碼的一部分嗎?如果是這樣,在哪裏?
任何想法都會非常有幫助。
感謝您的評論康萊德! 但如果recvfrom函數將在主線程獨自一人,怎麼可能當我們說我的服務器上獲取數據 - 4個客戶機發送出去一次,就它沒有任何問題? –
每個UDP客戶端都被分配一個助手線程。基於UDP IP和客戶端端口的客戶端映射將由主線程維護。在接收數據時,將使用IP和端口將數據轉發到正確的線程。 –
recvfrom函數只接收來自客戶端的UDP數據。它維護一個線程ID表以及每個線程負責的相應客戶端源IP和端口的映射。如果收到一個新數據包並且表中沒有條目,則可以創建一個新線程並在該表中分配一個新條目,並將數據連同客戶端IP和端口一起傳遞給該線程以發送回覆。如果收到新的數據包並且表中已經有映射,則數據通過消息隊列傳遞給該線程。 –