最适合instant messenger客户端的异步套接字模型? 我在C++ Win32中研究即时通信客户端,我正在尝试不同的异步套接字模型。到目前为止,我一直在通过主窗口接收通知。但是,我遇到了一些意想不到的结果,Winsock在为一个套接字调用WSAAsyncSelect时创建的初始线程之外,还额外生成了5-6个线程

最适合instant messenger客户端的异步套接字模型? 我在C++ Win32中研究即时通信客户端,我正在尝试不同的异步套接字模型。到目前为止,我一直在通过主窗口接收通知。但是,我遇到了一些意想不到的结果,Winsock在为一个套接字调用WSAAsyncSelect时创建的初始线程之外,还额外生成了5-6个线程,c++,sockets,C++,Sockets,我计划通过DLL:s修改客户端以支持其他协议,并且我担心我当前的解决方案不适合基于我使用WSAAsyncSelect的经验,另外我对在消息循环中混合网络和UI代码持否定态度 我正在寻找关于多协议IM客户端的合适异步套接字模型的建议,该客户端需要能够处理大约10-20+个连接,具体取决于协议数量和协议设计等。,虽然没有使用过多的线程,但我对性能和降低资源使用率非常感兴趣 我一直在寻找IO完成端口,但从我收集的数据来看,这似乎有些过头了。我非常感谢您对合适的插座解决方案的介绍 提前谢谢!:- 考虑使

我计划通过DLL:s修改客户端以支持其他协议,并且我担心我当前的解决方案不适合基于我使用WSAAsyncSelect的经验,另外我对在消息循环中混合网络和UI代码持否定态度

我正在寻找关于多协议IM客户端的合适异步套接字模型的建议,该客户端需要能够处理大约10-20+个连接,具体取决于协议数量和协议设计等。,虽然没有使用过多的线程,但我对性能和降低资源使用率非常感兴趣

我一直在寻找IO完成端口,但从我收集的数据来看,这似乎有些过头了。我非常感谢您对合适的插座解决方案的介绍


提前谢谢!:-

考虑使用boost www.boost.org中提供的ASIO库。

在某些方面IO完成端口IOCP有些过分,但老实说,我发现异步套接字的模型比所选择的备选方案、非阻塞套接字、重叠IO等更易于使用


IOCP API可能更清晰,但我认为,一旦你通过它,它实际上更容易使用。回想当年,最大的障碍是平台支持,它需要基于NT的操作系统,即Windows 9x不支持IOCP。由于这个限制已经过去了,我会考虑它。

< P>处理多个并发套接字有四种基本方法。 多路复用,即使用select轮询套接字。 AsyncSelect基本上就是使用WSAAsyncSelect进行的操作。 辅助线程,为每个连接创建一个线程。 IO完成端口或IOCP。dp在上面提到了它们,但基本上它们是处理异步I/O的一种特定于操作系统的方法,具有很好的性能,但有点让人困惑。 你选择哪一个通常取决于你计划去哪里。如果您计划将应用程序移植到其他平台,您可能希望选择1或3,因为select与其他操作系统上使用的其他模型没有太大区别,而且大多数其他操作系统也有线程的概念,尽管它们的操作可能不同。IOCP通常是特定于windows的,尽管Linux现在也有一些异步I/O功能

如果你的应用程序仅限于Windows,那么你基本上想要为你正在做的事情选择最好的模式。这可能是3或4。4是最有效的,因为它调用类似的应用程序,但性能更好,需要选择的问题更少

在使用IOCP或WorkerThreads线程时,您必须处理的一件大事是将数据封送回可以更新UI的线程,因为您不能在工作线程上调用UI函数。最终,在大多数情况下,这将涉及一些来回的消息传递


<>如果你在托管代码中开发这个代码,我会告诉你看看Jeffrey Richter的AySNeNuMeNeRealver,但是你选择C++,它有它的优点和缺点。许多人已经编写了各种C++网络库,也许你应该花一些时间来研究其中的一些。

< P>只是使用同步模型。现代操作系统很好地处理多线程。异步IO在极少数情况下确实需要,主要是在服务器上。

如果您决定使用IOCP,IMHO,这是为Windows编写的最佳选择,那么我有一些可用的免费代码,这会占用您需要做的大量工作

最新版本的代码和到原始文章的链接可从


关于我的框架与Boost::ASIO的比较,我的观点可以在这里找到:

非常有用的文章。非常感谢。哦,有一件事我没有提到;从IOCP线程到GUI线程的编组问题在我的框架中得到了帮助,因为套接字包装器对象和缓冲区对象都是引用计数的;只需添加它们并将它们作为参数发布在windows消息中。。。