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

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

之前残缺得更严重。但是把代码中的传输数据部分换成了 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