套接字联网API之二 select作用和案例

本文深入探讨了套接字联网API中的select模型,其核心在于解决异步网络编程问题,尤其是配合多线程使用。通过详细分析,指出select在避免阻塞I/O和减少CPU资源消耗中的角色。文章提供了一个服务端和客户端的示例,阐述了如何在主线程中设置select监听,并在新线程中处理连接,确保在接收FIN报文时能及时响应。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这个系列的上一篇文章讲了套接字联网API在服务端和客户端的几个主要函数。 这篇文章用来实现,顺便说一下select模型,也在下面的代码中用到。

///

select模型出现的真正原因在网上一直找不到,经过仔细思考其实只有一个,就是解决异步的问题;而且这个select是要结合多线程的。下面对这些进行说明。

1) 当使用阻塞 I/0时, 当阻塞在输入的时候无法进行读取的监听;

2) 当使用非阻塞I/O时,会在读取的监听上消耗CPU的资源。 其实这种情况即使忽略消耗的CPU资源,也是不能实现异步的。

3) 这时可能会考虑到使用多线程,就是让读取的监听  和  输入放在不同的线程中。

比如采用select监听一个套接字, 如果返回一个结果,就开辟一个新线程用来进行交互,假设这个新的线程阻塞在输入上,监听线程还是能够监听的,如果收到了一个FIN,能够及时的终止这个新的线程。  这就是select的作用,但是是不是每个连接都要设置一个select?  不用的,之需要在全局的主线程设置一个select就可以了,每当一个连接建立,就信开辟一个线程,主线程仍然在监听;而它又收到监听描述符上的信息后(比如FIN报文),就会对该描述符对应的线程进行处理。


下面是select的一个模型,分为服务端和客户端,有详细的注释。

服务端流程如下: 只发了一个文件,目的是弄清流程

#include <stdio.h>
#include <stdlib.h>
#include "server.h"
#include "
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值