簡體   English   中英

我的UDP套接字服務器設計正確嗎?

[英]Is my design for UDP socket server correct?

我正在設計一個使用MFC進行UDP通信的服務器。 我有以下課程

  • CMyDlialog-照顧用戶界面
  • CController-充當所有類之間的中介者
  • CProtocolManager-注意編碼/解碼消息(這是一個靜態類)
  • CConnectionManager-負責UDP連接,發送,接收

我正在將CConnectionManager的對象創建為CController中的成員變量,並將CController的對象創建為CMyDialog中的成員變量。

當用戶鍵入內容並按send時,我正在CControler中調用一個方法,該方法將在CProtocolManager中調用一個方法來構造數據包,並調用CConnectionManager方法來發送它。

當我收到一些數據時,它將在CConnectionManager的線程中處理。 我在這里創建一個CController的本地對象並調用一個方法,該方法會將數據傳遞給CProtocolManager進行解碼。

現在,我想通知UI有關數據,CControler應該如何做? 我可以通過使主對話框句柄變為全局來向UI發布消息,這是一種正確的方法。

還告訴我這種設計是否正確。

提前致謝

看來您是在單個線程中完成所有操作。 由於數據包來回往返需要時間,因此建議在其他線程中完成耗時的工作,並發布狀態/結果UI線程。 (否則,UI將被凍結)。

我認為設計永遠不會是非對非,但是您可以根據許多人認為是“好”的一些原則(請參見SOLID原則對它們進行評級

您的發送方法聽起來很合理,但是將Dialog全局設置為接收狀態絕對被認為“不太好”。 參見好萊塢原則 我建議您最好將回調方法傳遞給連接管理器,該方法是CController的方法(然后讓CProtocolManager對其進行解碼並從對話框中調用另一個回調方法)。 如果回調不是您想要的,則可以使用方法定義類似於“ AbstractMessageReceiver”的AbstractBaseClasses(ABC)

 virtual void receive(const char*, int length) = 0;

然后,您可以在CProtocolManager中實現此ABC,將其作為“ AbstractMessageReceiver *”傳遞給CConnectionManager,然后調用

m_myMessageReceiver->receive(m_buffer, m_length);

或類似的東西。

這種方法減少了耦合,更具可測試性,並增加了可重用性。

此外,我同意Am,您應該考慮自己的線程模型!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM