咖啡伴侶

          呆在上海
          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 讀取長數據

           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
          }



          主站蜘蛛池模板: 白河县| 柳河县| 湖州市| 广宁县| 巢湖市| 合作市| 绥化市| 霍邱县| 临安市| 武川县| 鹤庆县| 贡嘎县| 罗田县| 钟祥市| 布拖县| 兴海县| 永定县| 博乐市| 鄢陵县| 芜湖县| 福清市| 麻栗坡县| 巩义市| 鄂伦春自治旗| 承德县| 海门市| 马公市| 定远县| 绩溪县| 石城县| 天等县| 洪雅县| 南木林县| 长阳| 石泉县| 得荣县| 栾川县| 进贤县| 固安县| 皮山县| 巩义市|