传输数据中的writen() 和 read()

本文探讨了在传输二进制文件过程中遇到的图片残缺问题,并深入分析了造成该问题的原因,即readn函数的阻塞问题。文章提出了两种解决方案:一是使用fcntl()函数将管道设置为non_block模式;二是采用select函数进行监听。

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

最近在写的一个传输二进制文件的模块中,在传输图片的过程中老是会出现图片走形,图片残缺的现象!

之前残缺得更严重。但是把代码中的传输数据部分换成了 writen() 和 readn()就好多了。

但是仍然有一小部分的残缺。但是在服务端 写一个while(1)循环执行 readn 并且不跳出。就不会有残缺现象。

我现在跳出while(1)循环的条件是 

while(1){

res=readn(...)

 if(res==0){...break;}

//....写入

}  很明显就是跳出得太早了。

1 也就是还没有接收完成就跳出,没有接收完成导致没有写入最后的数据。

2 还有就是接收完成但是没有写入进去就跳出了。

最后发现原来是readn 的阻塞问题。

由于服务端读取速度太快的,导致了socket 缓冲区也许有那么一段毫秒几级别的时间空了。于是readn由于读不到数据后直接开始阻塞。

因为后面客户端又传送了数据,但是readn已经阻塞了。所以很无奈。

 

有两个方法解决:

1 用fcntl()函数将管道设置成 non_block 的模式。于是readn读不到数据也不会阻塞而是返回-1。但是这个方法非常耗CPU!

 

2 最好是用select 函数监听管道。

 

转载于:https://www.cnblogs.com/zzzPark/p/6560555.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值