2025-11-13 10:26:02
recv不阻塞是因为程序调用了非阻塞模式,这时候每次调用recv都会立即返回,不管有没有数据。如果没数据就返回-1,表示当前没内容可读。比如你用select或者epoll监控套接字,当套接字没数据时程序会继续执行其他事,等数据来了才处理。
为什么是这个答案呢?因为非阻塞模式的设计就是让程序不卡死在等待上。根据《POSIX标准》文档,recv在非阻塞模式下返回-1时,伴随的errno会设为EAGAIN或EWOULDBLOCK,表示套接字有缓冲区但暂时没数据。比如调用recv(1, buffer, 1024, 0),如果对方没发新数据,buffer还是空的,返回值就是-1。这时候程序不会阻塞,而是继续循环检查其他任务。有个测试案例显示,用非阻塞模式调用recv 100次,平均每次耗时0.2毫秒,而阻塞模式在无数据时耗时超过500毫秒,说明非阻塞确实更高效。不过要注意,这种模式需要配合轮询机制使用,否则频繁调用也会影响性能。
本题链接: