示例#1
0
文件: snet.go 项目: dengoswei/spaxos
// 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:
		}
	}
}