我正在使用C++(Win32)中的即时通讯客户端,我正在尝试使用不同的异步套接字模型.到目前为止,我一直在使用WSAAsyncSelect通过我的主窗口接收通知.但是,我遇到了一些意想不到的结果,Winsock还为一个插槽产生了5-6个线程(除了在调用WSAAsyncSelect时创建的初始线程).
我计划通过DLL修改客户端以支持其他协议:我担心我目前的解决方案不适合我的WSAAsyncSelect经验以及我对网络与UI代码混合的负面影响(在消息循环).
我正在寻找关于什么是合适的异步套接字模型可以用于多协议IM客户端的建议,该客户端需要能够处理大约10-20个连接(取决于协议数量和协议设计等),而不是使用过多的线程 - 我对性能非常感兴趣并且保持资源使用率下降.
我一直在寻找IO完成端口,但从我收集的内容来看,它似乎有些过分.我非常感谢有关合适的插座解决方案的一些信息!
提前致谢!:-)
处理多个并发套接字有四种基本方法.
多路复用,即使用select()轮询套接字.
AsyncSelect基本上就是你用WSAAsyncSelect做的事情.
工作线程,为每个连接创建一个线程.
IO完成端口或IOCP.dp在上面提到了它们,但基本上它们是处理异步I/O的操作系统特定方式,它具有非常好的性能,但它更令人困惑.
您选择的往往取决于您打算去的地方.如果您计划将应用程序移植到其他平台,您可能需要选择#1或#3,因为select与其他操作系统上使用的其他模型没有太大差别,而且大多数其他操作系统也有线程的概念(尽管它们可能以不同的方式运作 IOCP通常是特定于Windows的(尽管Linux现在也有一些异步I/O功能).
如果您的应用只是Windows,那么您基本上想要为您正在做的事情选择最佳模型.这可能是#3或#4.#4是最有效的,因为它回调到您的应用程序(类似,但具有更好的性能和更少的WSAsyncSelect问题).
使用线程(IOCP或WorkerThreads)时必须处理的重要事情是将数据封送回可以更新UI的线程,因为您无法在工作线程上调用UI函数.最终,这将涉及在大多数情况下来回传递的消息.
如果你在托管代码中开发这个,我会告诉你看看杰弗里里希特的AysncEnumerator,但是你选择了C++,它有它的优点和缺点.很多人为C++编写了各种网络库,也许你应该花一些时间研究其中的一些.