首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >最适合于即时通讯客户端的异步套接字模型?

最适合于即时通讯客户端的异步套接字模型?
EN

Stack Overflow用户
提问于 2009-02-07 20:24:26
回答 5查看 2.4K关注 0票数 4

我正在C++ (Win32)中开发一个即时通讯客户端,我正在试验不同的异步套接字模型。到目前为止,我一直在使用WSAAsyncSelect通过我的主窗口接收通知。但是,对于单个套接字,我已经经历了一些意外的结果,Winsock生成了另外5-6个线程(除了调用WSAAsyncSelect时创建的初始线程)。

我计划通过DLL:s对客户端进行改造,以支持附加协议,而且根据我使用WSAAsyncSelect的经验,恐怕我目前的解决方案并不合适,而且我对将网络与UI代码混合(在消息循环中)持否定态度。

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

我一直在寻找IO完成端口,但据我所收集的,这似乎是过头了。我非常感谢一些关于什么是合适的套接字解决方案的投入!

谢谢!-)

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-02-07 20:44:18

处理多个并发套接字有四种基本方法。

  1. 多路复用,即使用select()轮询套接字。
  2. AsyncSelect,这基本上就是您对WSAAsyncSelect所做的。
  3. Worker,为每个连接创建一个线程。
  4. 完成端口,或IOCP。上面提到了它们,但基本上它们是处理异步I/O的一种特定于操作系统的方法,它具有非常好的性能,但它更令人困惑。

你经常选择哪一个取决于你计划去哪里。如果您计划将应用程序移植到其他平台,您可能希望选择#1或#3,因为select与其他操作系统上使用的其他模型并没有太大的不同,而且大多数其他OS也有线程的概念(尽管它们的操作可能不同)。IOCP通常是特定于windows的(尽管Linux现在也有一些异步I/O功能)。

如果你的应用程序仅仅是Windows,那么你基本上想为你正在做的事情选择最好的模式。这可能是#3或#4。#4是最有效的,因为它会回调到您的应用程序中(类似,但是性能更好,WSAsyncSelect的问题也更少)。

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

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

票数 5
EN

Stack Overflow用户

发布于 2009-02-07 20:31:31

考虑使用在boost (www.boost.org)中可以找到的ASIO库。

票数 3
EN

Stack Overflow用户

发布于 2009-02-07 21:30:44

只需使用同步模型。现代操作系统很好地处理多个线程。异步IO在很少的情况下是真正需要的,主要是在服务器上。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/524512

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档