在C ++ winsock服务器中使用异步套接字的非阻塞模式不同

时间:2012-06-27 05:06:36

标签: c++ multithreading asyncsocket winsock2

在C ++中,我已经阅读了一些教程来创建一个可以接受来自多个客户端的连接的服务器。他们建议使用异步套接字,但我真的不知道为什么我们应该在非阻塞模式下选择异步。什么是使用多线程的想法?它比使用异步套接字更好吗?谢谢!

2 个答案:

答案 0 :(得分:1)

由于您正在使用C ++请求解决方案,因此boost asio是最好的异步io库。

我假设您在谈到“多线程”时所说的“每个客户端一个线程”解决方案,对于期望在短时间内或在同一时间连接的许多客户端的服务器来说,这通常是一个非常糟糕的主意。时间。 线程是用于此用途的资源消耗的方式,此外,您必须处理互斥,这与阻塞调用相结合可以非常快速地导致死锁。这是你遇到的最糟糕的事情。

此外,攻击者很容易利用您的服务器卡住。您将花费大量时间尝试设计代码,以避免这种情况,从而导致您出现难以理解,难以更新和错误的错误代码。

在boost.asio中,指定的线程(调用io_service :: run的那些线程)只有在实际工作时才会工作,直接引导您进入分配给该任务的对象。 因此技术上异步也是阻塞的,区别在于只有调度程序等待工作,而你添加的那些函数(connect,send,receive,...)将立即返回。

答案 1 :(得分:1)

我假设您正在谈论TCP而不是UDP。我绝对推荐跳过异步套接字,这些都受到微软和支持者的青睐,但不可移植。而是使用香草的东西:here's an exampleserverclient