多个CAsyncSocket服务器和客户端与单个MFC模态对话框链接的可能性



在我的一个MFC应用中,我有一个CAsyncSocket派生类和一个模态对话框。套接字事件处理程序(例如OnAccept() OnReceive())与对话框的相关对话成员函数链接。应用程序有两个Socket服务器;其中一个必须只服务一个客户端,而另一个必须服务多个客户端(例如4/5个客户端)。应用程序还有一个套接字客户端,它必须连接到服务器。目前,其中一个服务器套接字(只处理一个客户端)是CAsyncSocket派生类的实例。服务多个客户端的服务器是一个阻塞套接字,它接受客户端连接并在不同的线程中为它们提供服务。我的应用程序中的客户端套接字也是在另一个线程中运行的阻塞套接字。

如果我希望我的应用程序的服务器和客户端都是CAsyncSocket,并与单个对话框链接:

  1. 方法是否正确可行?
  2. 定义对话框的OnReceive()和OnSend()成员的最佳方法是什么,以便每个服务器和客户端都可以及时发送/接收消息,并且可以正确区分消息的来源在OnReceive()函数中是否有拥塞的可能性?如果是这样,有什么补救措施?
  3. 如果我想要实现的设计在一个对话框中是不可行的,那么实现它的正确方法是什么?

CAsyncSocket是一个非阻塞套接字,所以你的一些套接字阻塞的说法需要澄清。套接字事件处理程序(OnAccept, OnReceive,…)必须在从CAsyncSocket派生的类中。但如果你愿意,你可以让那些处理程序调用对话框中的函数。这就是你说的联系吗?

创建套接字对象时,可以向其构造函数传递一个标识号,该标识号存储在成员变量中。您还可以向对话框传递一个指针。然后,当它从OnReceive调用对话框时,它可以将识别数字传递回对话框,以便对话框可以区分源是什么。

OnReceive将不会有拥塞:通知和套接字数据都排队,所以它们等待,直到你处理它们。如果你的速度很慢,TCP/IP逻辑最终会暂停发送方,直到你处理好它所排队的东西。

因为CAsyncSocket是一个非阻塞套接字,所以可以从一个对话框中处理许多套接字。没有必要使用多个线程,而线程化会增加不必要的复杂性和问题。你应该首先让它在主线程中工作。

最新更新