Windows Sockets 非阻塞模式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Windows Sockets 非阻塞模式相关的知识,希望对你有一定的参考价值。

Windows Sockets 默认情况下是阻塞模式,怎么样才能让整个程序都是在非阻塞的模式下进行呢?
“Windows Sockets 为了实现当一个应用程序的套接字调用处于阻塞时,能够放弃CPU让其它应用程序运行,它在调用处于阻塞时便进入一个叫“HOOK”的例程,此例程负责接收和分配WINDOWS消息。”这句话摘于教程,就是说其实阻塞时就是用消息处理来打断阻塞模式了?那么有没有真正的非阻塞模式呢?像:sendto和send有什么区别呀?

阻塞模式就是说你代码是线性的,当这个过程中有代码需要比较长的时间才能完成时,那么,后面的代码就始终没有机会执行到。而非阻塞就不一样了,系统会在适当的时候告诉你,你向系统请求的操作已经完成了。
就算是阻塞也只会阻塞你的用户级别的线程,操作系统仍然会切换到其他的线程,给其他线程分配时间片。
阻塞模式的程序编写比较容易,因为代码是顺序执行的,所以编写者在逻辑上很好理解。而非阻塞模式下,通常需要提供一回调函数,当操作系统“告诉你你向系统请求的操作已经完成了”的方式就是调用你的回调函数。说简单点,就是你实现将我要如何处理事情的结果制定好,然后告诉系统,系统会在合适的时候执行。

高性能的网络处理模式都是非阻塞的,windows下性能最好的模型就是完成端口,只要CPU够强,能让你的网卡达到极限。Linux下酒是EPOLL
参考技术A 把发送与接收都放到线程里运功,阻塞了也没关系

以上是关于Windows Sockets 非阻塞模式的主要内容,如果未能解决你的问题,请参考以下文章

非阻塞socket总结

如何将socket设置为非阻塞模式

PHP Streams 中的阻塞和非阻塞模式

服务器编程心得—— 如何将socket设置为非阻塞模式

非阻塞socket

服务器编程心得—— 如何将socket设置为非阻塞模式