咖啡伴侶

          呆在上海
          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
          }



          主站蜘蛛池模板: 贵阳市| 安溪县| 高平市| 渑池县| 奈曼旗| 左贡县| 繁峙县| 公主岭市| 林周县| 杭锦旗| 云阳县| 美姑县| 汕头市| 赤水市| 临桂县| 黄冈市| 南通市| 页游| 宣威市| 南宁市| 白城市| 顺平县| 水富县| 桦南县| 新龙县| 安吉县| 萨迦县| 德保县| 房产| 佳木斯市| 西昌市| 玉树县| 万载县| 苍梧县| 澄城县| 铜山县| 龙海市| 武平县| 安溪县| 霞浦县| 永嘉县|