对于我在 Internet 上看到的 Linux/Unix 套接字教程的每一个教程和示例,服务器端代码总是涉及一个无限循环,每次都检查客户端连接。 示例:
http://www.thegeekstuff.com/2011/12/c-socket-programming/
http://tldp.org/LDP/LG/issue74/tougher.html#3.2
是否有更有效的方法来构建服务器端代码,使其不涉及无限循环,或者以占用更少系统资源的方式对无限循环进行编码?
最佳答案
这些例子中的无限循环已经很有效了。对 accept()
的调用是一个阻塞调用:该函数不会返回,直到有客户端连接到服务器。调用 accept()
函数的线程的代码执行被停止,并且不占用任何处理能力。
将 accept()
视为对 join()
的调用,或者类似于对互斥锁/锁/信号量的等待。
当然,还有许多其他方法可以处理传入连接,但那些其他方法处理 accept()
的阻塞性质。此功能很难取消,因此存在非阻塞替代方案,允许服务器在等待传入连接时执行其他操作。一种替代方法是使用 select()
。其他替代方案的可移植性较差,因为它们涉及低级操作系统调用以通过回调函数、事件或操作系统处理的任何其他异步机制发出连接信号...
关于c++ - 处理客户端连接的最有效方式(套接字编程),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11687215/