非堵塞IO的读与写的回射客户端对比分析

本文分析了非堵塞IO的读写操作,对比了基于tcp的堵塞IO模型与非堵塞IO在select下的复用模型。讨论了在非堵塞模式下,输入输出操作如何处理EWOULDBLOCK错误,以及套接字默认的堵塞状态对进程的影响。
摘要由CSDN通过智能技术生成

一、非堵塞读与写分析

1、老版本1分析--- 基于tcp的堵塞io模型

是read和write,结合起来处理的io模型,因为如果服务器没有数据过来,那么read将会一直堵塞下去。因为堵塞将会导致程序的效率不够高效。

伪代码如下如实:

while(fgets(buf, maxline,stdin) != NULL){
	write(sockfd, buf, strlen(buf));
	read(sockfd, buf, maxline);
}

分析堵塞条件:

1).write当中如果套接字发送缓冲区已满,write调用将会堵塞

2).read当中如果套接字接受缓冲区没有数据, 那么read将会一直堵塞下去,直到收到了来之服务器的数据。


2、老版本2分析---基于tcp的select中堵塞的io复用模型

在select来判断, 是否能读取数据, 可以排除老版本一当中的读取数据时候而造成的程序堵塞情况, 很大程度的提高了程序的执行效率。

伪代码如下所示:

for(;;){
	FD_SET(fileno(stdin), &rset);
	FD_SET(sockfd, &rset);
	
	select(maxfd + 1, &rset, NULL, NULL, NULL);
	if(FD_ISSET(fileno(stdin), &rset)){
		相关处理过程
	}
	
	if(FD_ISSET(sockfd, &rset)){
		相关处理过程 
	}
	
}
分析堵塞条件:
1).然而当调用write函数的时候,也会应为套接字发送缓冲区已满,而导致堵塞。

2).如果标准输出比网络慢, 那么进程也有可能堵塞与后续的write调用。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值