咖啡伴侶

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

          golang socket read tcp

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

           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) 不能確保讀完,所以修復(fù)成下面的代碼
          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
          }



          主站蜘蛛池模板: 尖扎县| 台南市| 惠来县| 古蔺县| 上蔡县| 名山县| 南安市| 永丰县| 浙江省| 长春市| 霍林郭勒市| 岐山县| 东莞市| 岳西县| 临猗县| 会东县| 绥江县| 盱眙县| 阿鲁科尔沁旗| 杭州市| 洛扎县| 鄂伦春自治旗| 酒泉市| 准格尔旗| 荣昌县| 长阳| 漳州市| 三亚市| 巴彦淖尔市| 浏阳市| 壤塘县| 理塘县| 三江| 会东县| 九龙县| 濉溪县| 鲜城| 兴海县| 贵州省| 莲花县| 新巴尔虎右旗|