Hallo zusammen,
ich bin gerade dabei, ein Programm zu schreiben, dass auf einem Root-Server laufen soll und gerschiedene Game-Server verwalten soll.
Ich hatte zunächst mit Arrays gearbeitet, was schon auch funktioniert hat, aber halt sehr sperrig ist (2-dimmensionales Array). Dann hab ich eine eigene structure definiert, hatte aber Probleme mit Schreibzugriffen und hab dann hier im Forum gelesen, dass Klassen hierfür doch ganz gut geeignet wären.
Vorweg vielleicht noch: ich bin relativ neu dabei, was die Programmierung mit VB.net angeht, ich denke, das wird man auch am Code sehen generell bin ich für Tipps dankbar
Mein jetztiger Stand:
Die Server selbst werden aus einer Datei zeilenweise ausgelesen. Dazu lese ich immer die entsprechenden Zeilen (zu einem Server) aus. So ein Datenpaket sieht folgendermaßen aus:
Das Auslesen mache ich so (geht bestimmt besser, aber die ausgelesenen Daten stimmen ) :
Mein Gedanke ist - mittlerweile glaube ich, dass das auch der Denkfehler ist - dass ich mit der Instanz srv zunächst alle Serverdaten sammle und dann am Ende ("DailyRestart" ist der letzte Eintrag) der Liste ServerList hinzufüge und dann eben die Instanz srv wieder mit dem nächsten Server neu befülle.
Mein Problem ist nun, dass die Instanz srv zwar die richtigen Daten enthält und diese dann auch in die Liste übernommen werden, beim erneuten Befüllen der Instanz srv und anschließendem ServerList.add(srv) ALLE Einträge in der ServerList auf den aktuellen Inhalt der Instanz srv gesetzt werden. Somit erhalte ich am Ende eine ServerList, die zwar in der Anzahl an Elementen, denen der Server entspricht, diese aber alle die Daten des zuletzt eingelesenem Server enthalten.
Daher meine Frage nun, was ich hier falsch gemacht habe?
Ich stelle mir das so vor, dass nach der Übergabe von srv an ServerList, die Werte unabhängig von srv gespeichert sind und ich srv neu befüllen kann. Nach dem Verhalten, das ich sehe, scheint es mir aber eher so, dass die Instanz srv mit der Liste verlinkt ist..
Vielen Dank für eure Hilfe!
cya Igel
ich bin gerade dabei, ein Programm zu schreiben, dass auf einem Root-Server laufen soll und gerschiedene Game-Server verwalten soll.
Ich hatte zunächst mit Arrays gearbeitet, was schon auch funktioniert hat, aber halt sehr sperrig ist (2-dimmensionales Array). Dann hab ich eine eigene structure definiert, hatte aber Probleme mit Schreibzugriffen und hab dann hier im Forum gelesen, dass Klassen hierfür doch ganz gut geeignet wären.
Vorweg vielleicht noch: ich bin relativ neu dabei, was die Programmierung mit VB.net angeht, ich denke, das wird man auch am Code sehen generell bin ich für Tipps dankbar
Mein jetztiger Stand:
VB.NET-Quellcode
- Enum ServerStatusField As Byte
- Stopped = 0
- Updating = 1
- UpdatingStart = 2
- Running = 3
- End Enum
- Public Class ServerInfo
- Private mstrServername As String
- Private mstrIP As String
- Private mintGameport As Integer
- Private mintQueryport As Integer
- Private mbytMaxplayers As Byte
- Private mbytTickrate As Byte
- Private mstrPath As String
- Private mintCPUAffinity As Integer
- Private mssfServerstate As ServerStatusField
- Private mintProcessID As Integer
- Private mintSteamCMDPID As Integer
- Private mbolDailyRestart As Boolean
- Public Property Servername As String
- Get
- Return mstrServername
- End Get
- Set(value As String)
- mstrServername = value
- End Set
- End Property
- '... hier folgen jetzt noch weitere Properties, aber das ist nicht das Problem
Die Server selbst werden aus einer Datei zeilenweise ausgelesen. Dazu lese ich immer die entsprechenden Zeilen (zu einem Server) aus. So ein Datenpaket sieht folgendermaßen aus:
Das Auslesen mache ich so (geht bestimmt besser, aber die ausgelesenen Daten stimmen ) :
VB.NET-Quellcode
- Public ServerList As New List(Of ServerInfo)
- Sub LoadServers()
- If File.Exists("servers.ini") Then
- Dim TmpFileArray() As String = Split(My.Computer.FileSystem.ReadAllText("servers.ini"), vbCrLf)
- Dim srv As New ServerInfo
- For Each FLine As String In TmpFileArray
- If FLine <> "" Then
- If FLine.Substring(0, 1) = "[" Then
- srv.Servername = FLine.Substring(1, FLine.Length - 2)
- Else
- Select Case Trim(FLine.Substring(0, FLine.IndexOf(" ")))
- Case "IP"
- srv.IP = Trim(FLine.Substring(FLine.IndexOf("=") + 1))
- Case "Gameport"
- srv.Gameport = Trim(FLine.Substring(FLine.IndexOf("=") + 1))
- Case "Queryport"
- srv.Queryport = Trim(FLine.Substring(FLine.IndexOf("=") + 1))
- Case "Maxplayers"
- srv.Maxplayers = Trim(FLine.Substring(FLine.IndexOf("=") + 1))
- Case "Tickrate"
- srv.Tickrate = Trim(FLine.Substring(FLine.IndexOf("=") + 1))
- Case "Path"
- srv.Path = Trim(FLine.Substring(FLine.IndexOf("=") + 1))
- Case "CPUAffinity"
- srv.CPUAffinity = Trim(FLine.Substring(FLine.IndexOf("=") + 1))
- Case "DailyRestart"
- srv.DailyRestart = Trim(FLine.Substring(FLine.IndexOf("=") + 1))
- srv.Serverstate = ServerStatusField.Stopped
- srv.ProcessID = 0
- srv.SteamCMDPID = 0
- ServerList.Add(srv)
- Case Else
- End Select
- End If
- End If
- Next
- End If
- End Sub
Mein Gedanke ist - mittlerweile glaube ich, dass das auch der Denkfehler ist - dass ich mit der Instanz srv zunächst alle Serverdaten sammle und dann am Ende ("DailyRestart" ist der letzte Eintrag) der Liste ServerList hinzufüge und dann eben die Instanz srv wieder mit dem nächsten Server neu befülle.
Mein Problem ist nun, dass die Instanz srv zwar die richtigen Daten enthält und diese dann auch in die Liste übernommen werden, beim erneuten Befüllen der Instanz srv und anschließendem ServerList.add(srv) ALLE Einträge in der ServerList auf den aktuellen Inhalt der Instanz srv gesetzt werden. Somit erhalte ich am Ende eine ServerList, die zwar in der Anzahl an Elementen, denen der Server entspricht, diese aber alle die Daten des zuletzt eingelesenem Server enthalten.
Daher meine Frage nun, was ich hier falsch gemacht habe?
Ich stelle mir das so vor, dass nach der Übergabe von srv an ServerList, die Werte unabhängig von srv gespeichert sind und ich srv neu befüllen kann. Nach dem Verhalten, das ich sehe, scheint es mir aber eher so, dass die Instanz srv mit der Liste verlinkt ist..
Vielen Dank für eure Hilfe!
cya Igel