咖啡伴侶

          呆在上海
          posts - 163, comments - 156, trackbacks - 0, articles - 2

          golang socket read tcp

          Posted on 2013-08-02 10:11 oathleo 閱讀(1183) 評論(0)  編輯  收藏 所屬分類: Golang
          golang socket 讀取長數據

           1 func read(conn net.Conn, length int) ([]byte, error) {
           2     data := make([]byte, length)
           3     buf_size := 8
           4     buf := make([]byte, buf_size)
           5     i := 0
           6     for {
           7         if length < buf_size {
           8             remain := make([]byte, length)
           9             _, err := conn.Read(remain)
          10             if err != nil {
          11                 return nil, err
          12             }
          13             copy(data[i:(i+length)], remain[:])
          14             return data, nil
          15         } else {
          16             _, err := conn.Read(buf)
          17             if err != nil {
          18                 return nil, err
          19             }
          20             copy(data[i:(i+buf_size)], buf[:])
          21             i += buf_size
          22         }
          23         length -= buf_size
          24     }
          25     return data, nil
          26 }

          上面的 _, err := conn.Read(buf) 不能確保讀完,所以修復成下面的代碼
          func read(conn net.Conn, length int) ([]byte, error) {
              data := make([]byte, length)
              buf_size := 1024
              buf := make([]byte, buf_size)
              i := 0
              for {
                  if length < buf_size {
                      if length == 0 {
                          return data, nil
                      }
                      remain := make([]byte, length)
                      r, err := conn.Read(remain)
                      if err != nil {
                          return nil, err
                      }
                      copy(data[i:(i+r)], remain[0:r])
                      i += r
                      length -= r
                  } else {
                      r, err := conn.Read(buf)
                      if err != nil {
                          return nil, err
                      }
                      copy(data[i:(i+r)], buf[0:r])
                      i += r
                      length -= r
                  }

              }
              return data, nil
          }



          主站蜘蛛池模板: 盐津县| 达孜县| 丽水市| 南漳县| 万安县| 惠东县| 丹东市| 福鼎市| 扎囊县| 呼和浩特市| 安陆市| 田东县| 徐闻县| 凤山县| 云浮市| 毕节市| 武宣县| 惠东县| 许昌县| 南京市| 岳普湖县| 杭锦后旗| 万荣县| 化州市| 宁波市| 班戈县| 五莲县| 泾阳县| 桐梓县| 临海市| 江门市| 仁布县| 海林市| 菏泽市| 蒲城县| 巍山| 凤城市| 磐石市| 北安市| 石狮市| 海城市|