我試圖編寫一個RFC 2812兼容的C++ IRC庫。 我在客戶端本身的設計上遇到了一些麻煩。 從我讀到的IRC通信往往是異步的。我使用boost::asio::async_read
和boost::asio::async_write
。 通過閱讀我收集的文檔,您無法在完成一個async_write請求之前執行多個async_write請求。因此,你最終會得到相當嵌套的回調。這不是打敗了做異步調用的目的嗎?使用同步調用來防止嵌套會不會更好?如果不是,爲什麼?其次,如果我沒有弄錯,每個boost::asio::async_write
後跟一個boost::asio::async_read
來接收服務器對發送命令的響應。因此,我的客戶端的函數需要一個回調參數,以便在客戶端收到響應後(例如發送另一個消息...),該類的用戶可以執行某些操作。C++ IRC客戶端設計
如果我要繼續使用異步來實現此操作,我應該保留一個std::deque<std::tuple<message, callback>>
並且每次boost::asio::async_write
完成,並且隊列中有一個元組,並且出隊併發送消息,然後引發回調?這是實現這個系統的最佳方式嗎?
我在想,因爲消息一直在發送,所以我將不得不實現某種偵聽器循環來排隊響應,但是如何將這些響應與觸發它們的特定命令關聯?或者在這種情況下,響應只是來自另一個用戶的信道消息?
所以你說我應該有一兩個'的std :: deque的<性病::組<消息,回調>>'和一個'的std :: deque的<性病::組<回覆,回調>>' ? 另外我應該產生一個線程來阻塞和不斷閱讀,並填寫答覆隊列?或者,遞歸調用async_read? 更新狀態是什麼意思 - 你能舉個例子嗎? 至於whois或ping命令,我可以在接收到特定回覆(如這些回覆)時「掛鉤」發送特定消息的例程。 –
@FranciscoAguilera IRC協議本質上是異步的,所以我不會建議阻止調用。該協議也不是特定於何時需要發送對命令的回覆,並且一些服務器實現可能不發送迴應。我認爲通過事件來處理服務器命令會更加健壯(例如,當接收到「JOIN」命令時調用'on_join'),而不是嘗試管理如此接近協議層的回調(客戶端可能會收到'JOIN'不響應客戶端發送的「JOIN」命令的命令)。 –
對,但你如何建議我收到這些命令?我需要調用async_read,不是嗎?我應該循環調用async_read從它的回調檢查數據讀取整個客戶端? –