예제 #1
0
파일: protocol.go 프로젝트: javajax/degdb
func (s *Server) handleHandshake(conn *Conn, msg *protocol.Message) {
	handshake := msg.GetHandshake()
	conn.Peer = handshake.GetSender()

	s.peersLock.RLock()
	peer := s.Peers[conn.Peer.Id]
	s.peersLock.RUnlock()

	if peer != nil {
		s.Printf("Ignoring duplicate peer %s.", conn.PrettyID())
		if err := conn.Close(); err != nil && err != io.EOF {
			s.Printf("ERR closing connection %s", err)
		}
		return
	}

	s.peersLock.Lock()
	s.Peers[conn.Peer.Id] = conn
	s.peersLock.Unlock()

	s.Print(color.GreenString("New peer %s", conn.PrettyID()))
	if !handshake.Response {
		if err := s.sendHandshake(conn, true); err != nil {
			s.Printf("ERR sendHandshake %s", err)
		}
	} else {
		if err := s.sendPeerRequest(conn); err != nil {
			s.Printf("ERR sendPeerRequest %s", err)
		}
	}
	go s.connHeartbeat(conn)
}
예제 #2
0
파일: network.go 프로젝트: nunb/degdb
func (s *Server) handleHandshake(conn *Conn, msg *protocol.Message) {
	handshake := msg.GetHandshake()
	conn.Peer = handshake.GetSender()
	s.Peers[conn.Peer.Id] = conn
	s.Printf("New peer %s", conn.Peer.Id)
	if !handshake.Response {
		if err := s.sendHandshake(conn, true); err != nil {
			log.Printf("ERR sendHandshake %s", err)
		}
	} else {
		msg := &protocol.Message{Message: &protocol.Message_PeerRequest{
			PeerRequest: &protocol.PeerRequest{
				Limit: -1,
				//Keyspace: s.LocalPeer().Keyspace,
			}}}
		if err := conn.Send(msg); err != nil {
			log.Printf("ERR sending PeerRequest: %s", err)
		}
	}
}