在 C++ 中,我阅读了一些教程来创建一个可以接受来自多个客户端的连接的服务器。他们建议使用异步套接字,但我真的不知道为什么我们应该选择异步而不是非阻塞模式。使用多线程的想法又是怎样的呢?它比使用异步套接字更好吗?谢谢!!
问问题
1650 次
2 回答
1
由于您要求使用 C++ 解决方案,因此boost asio是 imo 最好的异步 io 库。
我假设您在提到“多线程”时谈论的是“每个客户端一个线程”解决方案,这对于希望在短时间内有多个客户端或同时连接的服务器来说通常是一个非常糟糕的主意。线程是这种用途的资源消耗方式,而且您必须注意互斥,这与阻塞调用相结合会使您很快陷入死锁。这就是你可能遇到的最糟糕的情况。
此外,攻击者很容易利用您的服务器卡住。您将花费大量时间来尝试设计您的代码,以避免这种情况发生,这会导致您拥有不可读、难以更新和错误的电话代码。
在 boost.asio 中,指定的线程(调用 io_service::run 的线程)只会在实际有工作要做时才工作,直接将您引导到分配给任务的对象。因此,从技术上讲,异步也是阻塞的,不同之处在于只有调度程序等待工作完成,而您添加的那些功能(连接、发送、接收......)将立即返回。
于 2012-06-27T05:51:28.840 回答