在工作中,我負責將TCP服務器作爲Modbus從站設備的一部分來實現。我在堆棧交換和一般的互聯網上都做了大量的閱讀(包括優秀的http://beej.us/guide/bgnet/),但我在設計問題上掙扎。總之,我的設備只能接受2個連接,並且每個連接都會有輸入的modbus請求,我必須在主控制器循環中處理這些請求,然後回覆成功或失敗狀態。我有如何實現這一點的以下想法。在Linux上編寫多線程TCP服務器
有一個創建,結合,監聽並接受連接,偵聽器線程,然後產生一個新的並行線程監聽傳入數據和空閒超時時間後關閉連接的連接上。如果活動線程數目前爲2,則立即關閉新連接以確保只允許2個連接。
不要從偵聽器線程產生新的線程,而是使用select()檢測傳入的連接請求以及傳入的modbus連接在活動連接上(類似於Beejs指南中的方法)。
- 創建2個監聽器線程,每個監聽器線程創建一個可以阻止accept()調用的套接字(相同的IP和端口號),然後關閉套接字fd並處理連接。在這裏,我(可能天真地)認爲這將只允許最多2個連接,我可以使用阻塞讀取來處理。
我一直在使用C++很長一段時間,但對於Linux開發我相當陌生。對於上述哪種方法最好(如果有的話),以及如果我對Linux的經驗不足意味着他們中的任何一個都是非常糟糕的想法,我都非常歡迎。我熱衷於避免fork()並堅持pthreads,因爲傳入的modbus請求將被排隊並定期從主控制器循環讀取。提前感謝您的任何建議。
我喜歡這樣的聲音 - 唯一的問題是我的主循環嚴格禁止。它必須執行處理並定期處理來自監聽器線程的請求。考慮到這一點,你說選項2.會是最好的? – mathematician1975
@ mathematician1975你仍然可以使用我的方法,但不是在'accept'上使用short或no-timeout'select'來阻塞(或者讓偵聽套接字非阻塞,並使用'accept'並檢查'EAGAIN' /'EWOULDBLOCK ')知道何時可以接受連接。 –
我認爲考慮到我的時間限制,這是我在短期內追求的最佳解決方案。謝謝你的建議。 – mathematician1975