Per UDP prüfen ob Server Online ist

  • VB.NET

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von Tsuyo.

    Per UDP prüfen ob Server Online ist

    Hi.

    Ich muss über UDP prüfen ob mehrere Server, zb Call of Duty 4 Server online sind. Egal wie ich es mache, es wird immer als online angezeigt. Egal ob ich falsche oder richtige IP eingib. Bei Google gibt es nur relativ unbrauchbare Codeschnipsel.

    Hätte villeicht jemand eine Lösung? :rolleyes:
    Hi,

    Ich hätte noch eine Idee. Ich hab sie nicht getestet aber ich haffe mal sie funktioniert.
    Also kleine Erklärung. Es weren zwei Thread benötigst den Tester Thread der versucht zum Server zu verbinden und den TimeOut Thread der den Tester Thread noch eine gewissen Zeit Abbricht.

    VB.NET-Quellcode

    1. Private Sub UdpPortTest(ByVal ep As IPEndPoint, ByVal Timeout As Integer)
    2. Dim pts1 As ParameterizedThreadStart = New ParameterizedThreadStart(AddressOf Tester)
    3. Dim t_tester = New Thread(pts1)
    4. t_tester.Start(New Object() {ep})
    5. Dim pts2 As ParameterizedThreadStart = New ParameterizedThreadStart(AddressOf TimeOut_Timer)
    6. Dim t_timeout_timer As Thread = New Thread(pts2)
    7. t_timeout_timer.Start(New Object() {Timeout, t_tester})
    8. End Sub
    9. Private Sub Tester(ByVal obj() As Object)
    10. Dim client As UdpClient = New UdpClient()
    11. Dim ep As IPEndPoint = CType(obj(0), IPEndPoint)
    12. Try
    13. client.Connect(ep)
    14. 'Server ist online
    15. Catch ex As Exception
    16. 'TimeOut Server ist offline
    17. End Try
    18. If client.Client.Connected = True Then
    19. client.Close()
    20. End If
    21. End Sub
    22. Private Sub TimeOut_Timer(ByVal obj() As Object)
    23. Dim wait As Integer = Integer.Parse(obj(0))
    24. Dim t As Thread = CType(obj(1), Thread)
    25. Thread.Sleep(wait)
    26. If (t IsNot Nothing) Then
    27. If (t.IsAlive = True) Then
    28. t.Abort()
    29. 'TimeOut Server ist offline
    30. End If
    31. End If
    32. End Sub


    mfg almdandi
    Quatsch.

    Normalerweise haben die Server eine API. D.h du musst bestimmte Bytes an den Server schreiben, und der gibt dir ne Antwort.

    Die API musst du natürlich Suchen. Ich hatte sowas mal für Source Server geschrieben(Ist nur C#)


    Quellcode

    1. private static byte[] cmd(byte[] b)
    2. {
    3. byte[] ba = new Byte[b.Length + 4];
    4. ba[0] = 0xFF;
    5. ba[1] = 0xFF;
    6. ba[2] = 0xFF;
    7. ba[3] = 0xFF;
    8. int count = 4;
    9. for (int i = 0; i < b.Length; i++)
    10. {
    11. ba[count++] = b[i];
    12. }
    13. return ba;
    14. }
    15. byte[] A2A_PING = cmd(new byte[] { 0x69 });
    16. public int Ping() {
    17. UdpClient client = new UdpClient();
    18. client.Ttl = 100;
    19. client.Connect(hosty, porty);
    20. IPEndPoint ip = new IPEndPoint(IPAddress.Any, 0);
    21. client.Send(A2A_PING, A2A_PING.Length);
    22. before = DateTime.Now;
    23. byte[] req = client.Receive(ref ip);
    24. after = DateTime.Now;
    25. return (after - before).Milliseconds;
    26. }