我正在C++ (Win32)中开发一个即时通讯客户端,我正在试验不同的异步套接字模型。到目前为止,我一直在使用WSAAsyncSelect通过我的主窗口接收通知。但是,对于单个套接字,我已经经历了一些意外的结果,Winsock生成了另外5-6个线程(除了调用WSAAsyncSelect时创建的初始线程)。
我计划通过DLL:s对客户端进行改造,以支持附加协议,而且根据我使用WSAAsyncSelect的经验,恐怕我目前的解决方案并不合适,而且我对将网络与UI代码混合(在消息循环中)持否定态度。
我正在寻找关于多协议IM客户端合适的异步套接字模型的建议,该客户端需要能够处理大约10-20+连接的(取决于协议和协议设计的数量等),同时不使用过多的线程--我非常感兴趣的是性能和降低资源使用。
我一直在寻找IO完成端口,但据我所收集的,这似乎是过头了。我非常感谢一些关于什么是合适的套接字解决方案的投入!
谢谢!-)
发布于 2009-02-07 20:44:18
处理多个并发套接字有四种基本方法。
你经常选择哪一个取决于你计划去哪里。如果您计划将应用程序移植到其他平台,您可能希望选择#1或#3,因为select与其他操作系统上使用的其他模型并没有太大的不同,而且大多数其他OS也有线程的概念(尽管它们的操作可能不同)。IOCP通常是特定于windows的(尽管Linux现在也有一些异步I/O功能)。
如果你的应用程序仅仅是Windows,那么你基本上想为你正在做的事情选择最好的模式。这可能是#3或#4。#4是最有效的,因为它会回调到您的应用程序中(类似,但是性能更好,WSAsyncSelect的问题也更少)。
在使用线程( IOCP或WorkerThreads)时,您必须处理的一件大事是将数据封送回一个可以更新UI的线程,因为您不能在工作线程上调用UI函数。最终,在大多数情况下,这将涉及到一些来回消息传递。
如果您是在托管代码中开发这个程序,我会告诉您看看Jeffrey的AysncEnumerator,但是您已经选择了C++,它有其优点和缺点。很多人已经为C++编写了各种各样的网络库,也许您应该花一些时间研究其中的一些。
发布于 2009-02-07 20:31:31
考虑使用在boost (www.boost.org)中可以找到的ASIO库。
发布于 2009-02-07 21:30:44
只需使用同步模型。现代操作系统很好地处理多个线程。异步IO在很少的情况下是真正需要的,主要是在服务器上。
https://stackoverflow.com/questions/524512
复制相似问题