Rcon Console

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von Fakiz.

    Rcon Console

    Hey,

    Ich würde gerne eine Rcon Conole in mein Projekt einbauen mit der ich einen Gameserver steuern möchte. Nach langem suchen&testen der beispiele im Internet und Forum habe ich eine eig. sogar für mich ganz leichtes Beispiel gefunden in der das Problem mit dem AxWinsock gelöst wird. Allerdings bekomme ich immer eine Fehlermeldung

    Quellcode

    1. Wrong protocol or connection state for the requested transaction or request"


    Hat jemand eine Idee was ich falsch mache oder bin ich mit dem Winsock komplett auf dem falschen weg und es geht ganz anders?

    Hoffe ihr könnt mir helfen :) Hier mal der Code:

    VB.NET-Quellcode

    1. Dim commandst As String
    2. Dim pw As String
    3. Private Sub Command1_Click()
    4. Winsock1.RemoteHost = "127.0.0.1"
    5. Winsock1.RemotePort = "25575"
    6. End Sub
    7. Private Sub Command2_Click()
    8. pw = "test123"
    9. commandst = "Time set day"
    10. Dim rsend As String
    11. rsend = "ÿÿÿÿ" & Chr(2) & "Rcon " & pw & " " & commandst
    12. Winsock1.SendData(commandst) 'Hier tritt der Fehler auf :(
    13. End Sub
    14. Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
    15. Dim strdata As String
    16. Winsock1.GetData(strdata)
    17. strdata = Replace(strdata, "ÿÿÿÿprint", "")
    18. MsgBox(strdata)
    19. End Sub
    Erstmal eine Frage, was in Gottes Namen ist Rcon? Vom Namen her, wuerde ich raten, "reverse connection" ala reverseTCP. Command1_Click() schaut mir nach VB-Classic aus. ALso um was handelt es sich hier? .net(sagt der Titel bzw. die Tags), VB(sagt der Code)?
    And i think to myself... what a wonderfuL World!
    Was RCON ist und wie das funktioniert steht in dem Wiki eintrag: wiki.vg/RCON. Vllt wirst du daraus schlau :)

    Es geht um VB.Net. Das Command1_Click im Code ist bei mir ein Sub und nicht wie in vb.classic das button click event. Mache das übrigens in VS2017 falls das interessiert.

    MFG

    SidezockingLP schrieb:

    Vllt wirst du daraus schlau


    Zumindest das was auf der verlinkten zu finden ist, verstehe ich 8o . Aber es wird sicher im Netz etwas ausfuehrlicheres dazu geben. Dafuer das es ein Protokoll ist, sind doch ein wenig sehr wenig Infos dort zu bekommen.


    Aber da es sich um MineCraft-Server-Dinger handelt, kann ich dir wohl net helfen(kann net testen). Bin mehr an Racing-Games dran. Aktuell fummel ich an einem TM2-Server-Plugin wie xAseco.

    Nunja, ich bin so wie so raus aus der Sache, aber Winsock? War das nicht doch ein Control aus VB-C(lassic) zeiten?
    And i think to myself... what a wonderfuL World!
    da @Eddy ja nicht so begeistert von dem Winsock war habe ich weiter gesucht und bin auf die dll SourceRconLib.dll und dieses Projekt hier gestoßen github.com/aiusepsi/SourceRcon

    Ich habe jetzt probiert das mal in eine vb.net Formanwendung zu schreiben aber komme da leider nicht wirklich weit ohne Fehler. (Also das Beispiel ist eine C# Consolenanwendung) )Hat sich vllt von euch jdm schon mal mit dieser dll beschäftigt oder weiß wo in meinem Code der Fehler ist? Oder ist das mit dieser dll unsinvoll?
    Bin dankbar für jede Antwort :)

    VB.NET-Quellcode

    1. Private WithEvents sourceRcon As New SourceRcon()
    2. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    3. Dim text As String = "127.0.0.1"
    4. Dim text2 As String = ""
    5. Dim text3 As String = "test123"
    6. Dim text4 As String = Me.TextBox2.Text
    7. sourceRcon.Errors = New StringOutput(AddressOf ErrorOutput) 'Fehler: Ist kein ereignis und kann nicht direkt aufgerufen werden. Ich soll eine Raise Event Anweisung machen
    8. sourceRcon.ServerOutput += New StringOutput(AddressOf ConsoleOutput) 'Fehler: Ist kein ereignis und kann nicht direkt aufgerufen werden. Ich soll eine Raise Event Anweisung machen
    9. Try
    10. If SourceRcon.Connect(New IPEndPoint(IPAddress.Parse(text), Convert.ToInt32(text2)), text3) Then
    11. SourceRcon.ServerCommand(text4)
    12. Thread.Sleep(1000)
    13. End If
    14. Catch generatedExceptionName As Exception
    15. Me.output.Text = "Cannot connect" & vbLf
    16. End Try
    17. Dim expr_CD As TextBox = Me.output
    18. Dim text5 As String = expr_CD.Text
    19. expr_CD.Text = String.Concat(New String() {text5, text4, ": ", Me.output.Text, vbCr & vbLf})
    20. Me.inputTextBox.Text = ""
    21. End Sub
    22. Private Sub ErrorOutput(input As String)
    23. Me.output.Text = input
    24. End Sub
    25. Private Sub ConsoleOutput(input As String)
    26. Me.output.Text = input
    27. End Sub
    28. Protected Overrides Sub Dispose(disposing As Boolean) 'Fehler: Hat mehrere definitionen
    29. If disposing AndAlso Me.components IsNot Nothing Then
    30. Me.components.Dispose()
    31. End If
    32. MyBase.Dispose(disposing)
    33. End Sub
    Hab mir den Code jetzt nicht angesehen. Bringt auch nicht viel wenn du u s den Fehler nicht verrätst. Aber da es sich um die Source Engine handelt kannst du einfach nach dem Source Rcon Protocol suchen. Und das ganze selbst umsetzen.
    Die Fehler stehen als Anmerkungen grün im Code

    Wer lesen kann...


    Fehler: Hat mehrere definitionen

    Das du die Dispose Methode in deiner Form überschreibst macht keinen Sinn, wenn die Form vom Designer erstellt wurde. Das kannst du also raus löschen.


    Fehler: Ist kein ereignis und kann nicht direkt aufgerufen werden. Ich soll eine Raise Event Anweisung machen

    Du abonierst deine Events falsch. Die Syntax funktioniert bei c# allerdings nicht bei Vb .Net.
    Das müsste in Vb .Net etwa so aussehen AddHandler sourceRcon.ServerOutput, AddressOf ConsoleOutput
    @Fakiz Danke :) Die Fehler sind nun raus. Der Code funktioniert und verbindet sich zum RCON :) . Nur sendet nicht die Befehle bzw nicht richtig :( Es gibt auch keinerlei Fehler zur Laufzeit :(
    Vllt findest du wieder den Fehler xD. Sry dass ich die ganze zeit nur Code poste und euch die Fehler suchen lasse aber ich habe noch nichts mit RCON gemacht, zwar schonmal mit TCP chat aber...

    Hier den Code den ich verwenden wollte um die befehle zu senden:

    {Alles ist in der Public Class SourceRcon }

    VB.NET-Quellcode

    1. Public Sub ServerCommand(command As String)
    2. If m_connected Then
    3. Dim PacketToSend As New RCONPacket()
    4. PacketToSend.RequestId = 2
    5. PacketToSend.ServerDataSent = RCONPacket.SERVERDATA_sent.SERVERDATA_EXECCOMMAND
    6. PacketToSend.String1 = command
    7. SendRCONPacket(PacketToSend)
    8. End If
    9. End Sub
    10. Private Sub SendRCONPacket(p As RCONPacket)
    11. '######################### DAmit wollte ich die Befehle senden '############################################
    12. Dim Packet As Byte() = p.OutputAsBytes()
    13. S.BeginSend(Packet, 0, Packet.Length, SocketFlags.None, New AsyncCallback(AddressOf SendCallback), Me) 'Kein Fehler zur Laufzeit
    14. End Sub


    Das S im code ist

    Quellcode

    1. ​S = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
    Da gibt es jetzt ein hülle an potentiellen Fehlern. Da könnte die Buffer Size des Sockets zu gering eingestellt sein das Byte[] Packet könnte NULL sein eventuell keine Verbindung ect. Da wirst du wohl im Einzelschritt Debuggen müßen.

    Oder besser du schreibst dir das ganze selbst, Source Rcon Protocol.