我的UDP套接字服务器设计是否正确?

时间:2010-10-07 05:06:16

标签: c++ visual-c++ mfc udp

我正在设计一个使用MFC进行UDP通信的服务器。我有以下课程

  • CMyDlialog - 照顾用户界面
  • CController - 充当所有班级之间的调解员
  • CProtocolManager - 负责编码/解码消息(这是一个静态类)
  • CConnectionManager - 负责UDP连接,发送,接收

我在CController中创建CConnectionManager的对象作为CController中的成员变量,在CMyDialog中创建CController的对象作为成员变量。

当用户键入内容并按下send时,我在CControler中调用一个方法,该方法将调用CProtocolManager中的方法来构造数据包并调用CConnectionManager方法发送它。

当我收到一些数据时,它会在CConnectionManager的一个线程中处理。我正在创建一个CController的本地对象并调用一个方法,该方法将数据传递给CProtocolManager进行解码。

现在我想告知用户界面有关数据的信息,CControler应该怎么做?我可以通过使主对话框处理为全局来向UI发布消息,这是一种正确的方法。

还要告诉我这个设计是否正确。

提前致谢

2 个答案:

答案 0 :(得分:0)

似乎你在一个线程中完成所有操作。由于数据包来回需要时间,因此建议在不同的线程中完成耗时的工作,并在UI线程上发布状态/结果。 (或者UI将被冻结)。

答案 1 :(得分:0)

我认为设计永远不对或错,但您可以根据许多人认为“好”的原则对其进行评分(参见the SOLID principles)。

您的发送方式听起来很合理,但将Dialog设为全球接收绝对被认为“不太好”。见the hollywood principle。我建议你最好把一个回调方法传递给你的连接管理器,这是CController的一个方法(然后让CProtocolManager解码它并从对话框中调用另一个回调方法)。如果回调不是您想要的,您可以使用方法

将AbstractBaseClasses(ABC)定义为“AbstractMessageReceiver”
 virtual void receive(const char*, int length) = 0;

然后,您可以在CProtocolManager中实现此ABC,将其作为“AbstractMessageReceiver *”传递给CConnectionManager,然后调用

m_myMessageReceiver->receive(m_buffer, m_length);

或类似的东西。

这种方法减少了耦合,更加可测试并提高了可重用性。

此外,我同意Am你应该考虑你的线程模型!