前言
对socket在阻塞和非阻塞模式下各个socket函数的表现进行深入理解,是掌握网络编程的基本要求之一,也是重点和难点。
在阻塞和非阻塞模式下,我们常常讨论的具有不同行为表现的socket函数一般有connect,accept,send和recv。
定义
阻塞模式:指的是当某个函数执行成功的条件当前不满足时,该函数会阻塞当前执行线程,程序执行流在超时时间到达或执行成功的条件满足后恢复继续执行。
非阻塞模式:即使某个函数执行成功的条件不满足,该函数也不会阻塞当前执行线程,而是立即返回,继续执行程序流。
如何将socket设置为非阻塞模式
无论是在Windows还是Linux,默认创建的socket都是阻塞模式的。
在Linux上,可以通过使用fcntl函数或者ioctl函数给创建的socket增加O_NONBLOCK标志来将socket设置为非阻塞模式,示例代码如下:
int oldSocketFlag = fcntl(socketfd, F_GETFL, 0);
int newSocketFlag = oldSocketFlag | O_NONBLOCK;
fcntl(socketfd, F_SETFL, newSocketFlag);
当然,Linux上的socket函数也可以在创建时将socket设置为非阻塞模式,socket函数签名如下:
int socket(int domain, int type, int protocol);
只要给type参数增加一个SOCK_NONBLOCK标志即可,例如:
int s = socket(AF_INET, SOCK_STREAM | SOCK_NONBLOCK, IP

本文深入探讨了socket在阻塞和非阻塞模式下的工作原理,包括如何设置非阻塞模式,send和recv函数在两种模式下的行为,以及它们在不同应用场景的选择。重点讲解了非阻塞模式下正确使用send/recv的方法,并分析了两种模式在高并发和问答式通信场景下的适用性。
最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



