zoukankan      html  css  js  c++  java
  • 传输数据中的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 函数监听管道。

  • 相关阅读:
    整除
    奇怪的生日礼物
    欧拉函数平方和
    奇怪的生日礼物(数论基础)
    整除(简单数论)
    Tarjan求割点
    构造双连通(tarjan)
    次小生成树
    机器扫边
    最短路径(树形DP)
  • 原文地址:https://www.cnblogs.com/zzzPark/p/6560555.html
Copyright © 2011-2022 走看看