示例#1
0
func (sw *SSwitch) handleNetworkConnection(conn net.Conn) {

	defer conn.Close()

	reader := bufio.NewReader(conn)
	assert(nil != reader)
	for {
		//		err := conn.SetReadDeadline(time.Now().Add(2 * time.Millisecond))
		//		if nil != err {
		//			LogErr("%s conn.SetReadDeadline conn %s err %s",
		//				GetCurrentFuncName(), conn, err)
		//			return
		//		}

		var pkglen int
		var err error
		{
			var totalLen uint32
			err = binary.Read(reader, binary.BigEndian, &totalLen)
			if nil != err {
				LogErr("%s binary.Read err %s", GetCurrentFuncName(), 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 {
				LogErr("%s binary.Read pkglen %d err %s",
					GetCurrentFuncName(), pkglen, err)
				return
			}

			assert(0 < readlen)
			pkg = append(pkg, value...)
		}

		assert(pkglen == len(pkg))
		msg := pb.Message{}
		err = msg.Unmarshal(pkg)
		if nil != err {
			LogErr("%s pb.Message.Unmarshal err %s",
				GetCurrentFuncName(), err)
			return
		}

		if _, ok := sw.peers[msg.From]; !ok || sw.id != msg.To {
			LogDebug("%s ignore msg %v",
				GetCurrentFuncName(), msg)
			continue
		}

		LogDebug("net switch hostid %d recv msg (type %s) %v",
			sw.id, pb.MessageType_name[int32(msg.Type)], msg)
		// feed msg into node
		select {
		case sw.nrecvc <- msg:
		case <-sw.done:
			return
		}
	}
}