Пример #1
0
func (s *Server) IsMinecraftServerResponding() bool {
	conn, err := net.DialTimeout("tcp", s.IPAddress+":25565", time.Second*5)
	if err != nil {
		return false
	}

	defer conn.Close()

	conn.SetDeadline(time.Now().Add(time.Second * 5))

	stream := protocol.NewStream(conn)
	handshake := protocol.NewPacketWithID(0x00)
	handshake.WriteVarInt(5)
	handshake.WriteString(s.IPAddress)
	handshake.WriteUInt16(25565)
	handshake.WriteVarInt(1)
	if err := stream.WritePacket(handshake); err != nil {
		return false
	}

	request := protocol.NewPacketWithID(0x00)
	if err := stream.WritePacket(request); err != nil {
		return false
	}

	conn.SetDeadline(time.Now().Add(time.Second * 5))

	_, length, err := stream.GetPacketStream()
	if err != nil {
		return false
	}

	if length > 5 {
		return true
	}

	return false
}
Пример #2
0
func handleConnection(conn net.Conn) {
	defer conn.Close()

	player := &Player{
		IPAddress:   strings.Split(conn.RemoteAddr().String(), ":")[0],
		Stream:      protocol.NewStream(conn),
		Connection:  conn,
		ShouldClose: false,
		State:       1,
	}

packetLoop:
	for {
		if player.ShouldClose {
			return
		}

		packetStream, _, err := player.Stream.GetPacketStream()

		if err != nil {
			if err == io.EOF {
				return
			}

			log.Println("beacon: Failed to read next packet:", err)
			return
		}

		packetID, err := packetStream.ReadVarInt()
		if err != nil {
			log.Println("beacon: Failed to read packet ID:", err)
			return
		}

		switch packetID {
		case 0:
			err := handlePacketID0(player, packetStream)
			if err != nil {
				log.Println("beacon: Failed to handle packet ID 0:", err)
			}

			if player.ForwardAddress != "" {
				break packetLoop
			}
		case 1:
			if err := handlePacketID1(player, packetStream); err != nil {
				log.Println("beacon: Failed to handle packet ID 1:", err)
			}
		case 122:
			return
		default:
			log.Println("beacon: Unknown packet ID:", packetID)
		}

		numBytes, err := packetStream.ExhaustPacket()
		if err != nil {
			log.Println("beacon: Failed to exahust", numBytes, "packets:", err)
		} else if numBytes > 0 {
			log.Println("beacon: Exhausted", numBytes,
				"bytes. (Exhausting packets shouldn't happen).")
		}
	}

	forwardConnection(player)
}