Announcement

Collapse
No announcement yet.

Prüfen ob auf einem bestimmten UDP-Port ein Server aktiv ist...aber wie?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Prüfen ob auf einem bestimmten UDP-Port ein Server aktiv ist...aber wie?

    Hallo!

    Ich möchte auf einem lokalen Rechner prüfen ob auf einem bestimmten UDP-Port ein Server auf Anfragen lauscht. Wie kann ich das in Delphi umsetzen? Mit einer Client.Socket-Komponente funktioniert es ja nicht, da diese nur TCP-IP versteht. Wer kann mir helfen?

    Schönes Wochenende,
    Marco

  • #2
    Hallo,

    du solltest die Indy-Komponenten verwenden. Diese sind bei Delphi 7 integriert oder können bei Bedarf auch aus dem Internet geladen werden. Es gibt auch einen umfangreichen Beispiel - Download auf der Indy Homepage.

    WEB: http://www.indyproject.org/

    <pre>
    procedure TUDPMainForm.FormCreate(Sender: TObject);
    begin
    Randomize; // remove if you want reproducible results.
    HostName.Caption := UDPClient.LocalName;
    HostAddress.Caption := GStack.LocalAddress;
    Port.Caption := IntToStr(UDPClient.Port);
    DestinationAddress.Caption := UDPClient.Host;
    BufferSize.Caption := IntToStr(UDPClient.BufferSize);
    UDPClient.ReceiveTimeout := RECIEVETIMEOUT;
    end;

    procedure TUDPMainForm.SendButtonClick(Sender: TObject);
    var
    MessageID: Integer;
    ThisMessage: String;
    ReceivedString: String;
    begin
    MessageID := Random(MAXINT);
    ThisMessage := 'Message: ' + IntToStr(MessageID);
    UDPMemo.Lines.Add('Sending ' + ThisMessage);
    UDPClient.Send(ThisMessage);
    ReceivedString := UDPClient.ReceiveString();
    if ReceivedString = '' then
    UDPMemo.Lines.Add('No response received from the server after ' + IntToStr(UDPClient.ReceiveTimeout) + ' millseconds.')
    else
    UDPMemo.Lines.Add('Received: ' + ReceivedString)
    end;
    </pre>

    Mathia

    Comment


    • #3
      Hallo Mathias,

      danke dir für diesen Tipp!
      Kann denn das wirklich funktionieren?
      Die Interna des Server-Programms sind mir nicht bekannt. Wenn ich jetzt über die von dir beschriebene Indy-Komponente Daten an den Server sende, die dieser wohlmöglich nicht interpretieren kann, erhalte ich mit gut Glück gerade mal eine Fehlermeldung vom Server zurück. Ich möchte eigentlich nur prüfen, ob der Server auf einem Port aktiv ist oder nicht und dieses in meiner Anwendug anzeigen. Geht das wirklich mit deinem Beispiel und der Indy-Komponente.

      GRuß,
      Marc

      Comment


      • #4
        Hallo Marco,

        das angezeigte Beispiel habe ich per Zwischenablage aus einem Indy Demo File gezogen. Es sollte nur kurz ziegen das Indy eben auch mit "UPD" klar kommt.

        Alos wenn Du die Kommunikationsprotokolle des Servers nicht kennst. Kann eine Lösung von Deiner Seite nicht entwickelt werden.

        Hier ein paar Ideen

        1) Schreibe Dir einen Dienst auf der Serverseite mit dem Du kommunizieren kannst. Der Dienst soll nur ermitteln, ob der entsprechende Serverdienst ausgeführt wird oder nicht.

        2) Öffne den entsprechenden Port und reagiere auf Exception oder auf das Event OnConnect.

        Aber wenn Du eine professionelle Lösung benötigst. Solltest Du mit dem Serveradmin Verbindung aufnehmen, und zusammen über eine Lösung verhandeln. Wäre vieleicht auch gleich eine Möglichkeit sich in WebServices einzuarbeiten die Heute bzw. in der Zukunft interessant sein dürften.

        P.S. Client/Server Software kann nur entwickelt werden, wenn beide Seiten bekannt sind. Oder wenn über Standard Kommuniaktionsebenen wie SOAP oder ähnlich gearbeitet wird.

        Gruß Mathia

        Comment


        • #5
          Hallo Mathias,

          vielen Dank für Deine Tipps!

          Ich habe es jetzt folgendermaßen gelöst:

          Ich prüfe einfach auf dem Rechner, auf dem der Server ausgeführt wird, ob der Server aktiv ist. Glücklicherweise wird, sobald der Server läuft, ein Prozess im Taskmanager angelegt. Sobald der Server deaktiv ist wird dieser wieder entfernt. Mit der Client- und Server-Socket-Komponente werde ich einen kleines Programm schreiben, das die Prozesse überwacht und eine entsprechende Meldung an die Clients schickt. Das sollte eigentlich gut funktionieren.

          Viele Grüße,
          Marc

          Comment


          • #6
            Hallo,

            ja okay das hört sich schon besser an. Aber ich würde an Deiner Stelle auf die TServerSocket oder TClientSocket Komponenten verzichten. Diese arbeiten nicht ganz sauber. Es werden teilweise bei normaler Kommunikation Socket - Exception produziert. Und außerdem wurden diese Komponenten von Borland schon auf die Blacklist gesetzt. In Delphi 7 z.B. müssen diese bei Bedarf manuell nachinstalliert werden.

            Gruß Mathia

            Comment

            Working...
            X