// simple network wrapper func handleConnection( conn net.Conn, recvc chan pb.Message, groupsid map[uint64]bool) { reader := bufio.NewReader(conn) for { var pkglen int { var totalLen uint32 err := binary.Read(reader, binary.BigEndian, &totalLen) if nil != err { fmt.Println("binary.Read %s", err) return } pkglen = int(totalLen) assert(0 <= pkglen) } var pkg []byte for len(pkg) < pkglen { value := make([]byte, pkglen-len(pkg)) readlen, err := reader.Read(value) if nil != err { return } assert(0 < readlen) pkg = append(pkg, value...) } assert(pkglen == len(pkg)) msg := pb.Message{} err := msg.Unmarshal(pkg) if nil != err { return } if _, ok := groupsid[msg.From]; !ok { // invalid msg.From continue } // feed msg into node select { case recvc <- msg: } } }