示例#1
0
文件: auth.go 项目: cokeboL/mandela
//接收
//name   自己的名称
//@return  remoteName   对方服务器的名称
func (this *Auth) RecvKey(conn net.Conn, name string) (remoteName string, err error) {
	/*
		获取对方的名称
	*/
	if remoteName, err = GetNameForConn(conn); err != nil {
		return
	}
	/*
		开始验证对方客户端名称
	*/
	clientIdInfo := new(nodeStore.IdInfo)
	json.Unmarshal([]byte(remoteName), clientIdInfo)
	/*
		这是新节点,需要给他生成一个id
	*/
	if clientIdInfo.Id == Str_zaro {
		//生成id之前先检查这个id是否存在
		// fmt.Println("在网络中注册一个域名:", clientIdInfo.Domain)
		targetId := utils.GetHashForDomain(clientIdInfo.Domain)
		msgOne := &msgcenter.Message{
			TargetId:   targetId,
			ProtoId:    msgcenter.MSGID_findDomain,
			CreateTime: time.Now().Unix(),
			Sender:     nodeStore.ParseId(nodeStore.GetRootIdInfoString()),
			Content:    []byte(clientIdInfo.Domain),
			Accurate:   false,
		}
		msgOne.Hash = msgcenter.GetHash(msgOne)
		ret := <-msgcenter.SendTimeOutMsg(msgOne, time.Second*10)
		if ret == "timeout" {
			err = errors.New("查询域名超时")
			return
		}
		if ret == "true" {
			err = errors.New("这个域名已经被注册了")
			return
		}

		*clientIdInfo = nodeStore.NewIdInfo(clientIdInfo.Name, clientIdInfo.Email, clientIdInfo.Domain, nodeStore.ParseId(name))
		//给服务器发送生成的id
		newName := string(clientIdInfo.Build())
		conn.Write(GetBytesForName(newName))
		err = errors.New("给新节点分配一个idinfo")
		return
	}

	/*
		验证成功后,向对方发送自己的名称
	*/
	//得到对方名称
	conn.Write(GetBytesForName(name))
	return
}
示例#2
0
文件: id.go 项目: cokeboL/mandela
/*
	连接超级节点,得到一个id
	@ addr   超级节点ip地址
*/
func GetId(idInfo nodeStore.IdInfo) (newIdInfo *nodeStore.IdInfo, err error) {
	// idInfo = nodeStore.IdInfo{
	// 	Id:     Str_zaro,
	// 	Name:   "nimei",
	// 	Email:  "*****@*****.**",
	// 	Domain: "djfkafjkls",
	// }

	conn, err := net.Dial("tcp", getSuperAddrOne())
	if err != nil {
		err = errors.New("连接超级节点失败")
		return
	}

	/*
		向对方发送自己的名称
	*/
	lenght := int32(len(idInfo.Build()))
	buf := bytes.NewBuffer([]byte{})
	binary.Write(buf, binary.BigEndian, lenght)
	buf.Write(idInfo.Build())
	conn.Write(buf.Bytes())

	/*
		对方服务器创建好id后,发送给自己
	*/
	lenghtByte := make([]byte, 4)
	io.ReadFull(conn, lenghtByte)
	nameLenght := binary.BigEndian.Uint32(lenghtByte)
	nameByte := make([]byte, nameLenght)
	n, e := conn.Read(nameByte)
	if e != nil {
		err = e
		return
	}
	//得到对方生成的名称
	newIdInfo = new(nodeStore.IdInfo)
	json.Unmarshal(nameByte[:n], newIdInfo)
	conn.Close()
	return
}