Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi IdUDPServer.UDPRead wird nicht aufgerufen (https://www.delphipraxis.net/98652-idudpserver-udpread-wird-nicht-aufgerufen.html)

RobertP 30. Aug 2007 14:32


IdUDPServer.UDPRead wird nicht aufgerufen
 
Hallo,
ich hab ein kleines Problem mit dem UDP Server von den Indys in einem Konsolenprogramm:
UDPRead wird nicht aufgerufen. Der Broadcast funktioniert und die Antwort kommt auch (mit Wireshark überprüft). udp.ReceiveString funktioniert auch.

Was mach ich falsch?

Delphi-Quellcode:
type
  TUDPRead = class
    procedure UDPRead(Sender: TObject; AData: TBytes;
      ABinding: TIdSocketHandle);
  end;

var
  readUDP : TUDPRead;
  udp : TIdUDPServer;

procedure TUDPRead.UDPRead(Sender: TObject; AData: TBytes; ABinding: TIdSocketHandle);
begin
  Writeln('read');
end;

begin
  udp := TIdUDPServer.Create(nil);
  udp.OnUDPRead := readUDP.UDPRead;
  udp.Broadcast(cast, 1900);
  ReadLn;
end.

Apollonius 30. Aug 2007 14:39

Re: IdUDPServer.UDPRead wird nicht aufgerufen
 
1. readUDP wurde nicht instanziert. Dies verursacht Zugriffsverletzungen, wenn du in der Methode UDPRead auf Felder
zugreifst.
2. Zumindest die Windows-Sockets arbeiten mit Nachrichten, sodass du ohne Nachrichtenschleife keine Chance hast. Es
kann sein, dass es bei den Indys ebenso ist.

richard_boderich 30. Aug 2007 14:43

Re: IdUDPServer.UDPRead wird nicht aufgerufen
 
Deaktiviere mal den SSDP Dienst und falls du hast den WindowsMessenger und probier ob es dann läuft.

Gruß Richard

RobertP 30. Aug 2007 14:49

Re: IdUDPServer.UDPRead wird nicht aufgerufen
 
Zitat:

Zitat von richard_boderich
Deaktiviere mal den SSDP Dienst und falls du hast den WindowsMessenger und probier ob es dann läuft.

Beides deaktiviert / deinstalliert.

Mit Nachrichtenschleife hab ichs auch schon probiert, ändert nix:
Delphi-Quellcode:
repeat
    while PeekMessage(Msg, 0, 0, 0, PM_REMOVE) do
    begin
     TranslateMessage(Msg);
     DispatchMessage(Msg);
    end;
  until canclose;
Und was meinst du mit instanzieren?

Edit: In ner normalen VCL Anwendung läufts...

Apollonius 30. Aug 2007 15:23

Re: IdUDPServer.UDPRead wird nicht aufgerufen
 
Zitat:

Und was meinst du mit instanzieren?
Nun, wenn "gereadet" werden soll, versucht dein Server, ReadUDP.UDPRead aufzurufen. ReadUDP ist aber nil, weil du nirgends ReadUDP:=TUDPRead.create eingefügt hast. Und deshalb darfst du in der Methode nicht auf Felder zugreifen, weil es sonst eine Zugriffsverletzung gibt. Das ist nur als allgemeiner Hinweis gedacht. Da du nicht auf Felder zugreifst und es auch keine AV gibt, liegt es nicht daran.

shmia 30. Aug 2007 15:50

Re: IdUDPServer.UDPRead wird nicht aufgerufen
 
Damit der UDP Server eine Antwort empfangen kann, muss ihm eine lokale Portnummer
zugewiesen werden.
Sonst wäre die Portnummer = 0, und das ist nicht zulässig.
Ausserdem muss der Komponente "gesagt" werden, das jetzt der eingestellte Port abgehört werden soll.
Da fehlt ein .Listen oder wie auch immer das Property oder die Methode heisen mag.

RobertP 30. Aug 2007 17:22

Re: IdUDPServer.UDPRead wird nicht aufgerufen
 
Habs nun so versucht:
Delphi-Quellcode:
udp.Bindings.DefaultPort := 2000;
  socket := TIdSocketHandle.Create(udp.Bindings);
  socket.Listen();
Geht auch net! Fehler: Socket Error # 10038 Socket Operation on non-socket.

Ich versteh allerdings auch net wieso das alles nicht nötig ist wenn ichs mit VCL mach...

richard_boderich 30. Aug 2007 18:48

Re: IdUDPServer.UDPRead wird nicht aufgerufen
 
lass mich jetzt mal raten, an port 1900 kontest du es nicht binden richtig?

shmia 31. Aug 2007 08:46

Re: IdUDPServer.UDPRead wird nicht aufgerufen
 
Delphi-Quellcode:
  udp := TIdUDPServer.Create(nil);
  udp.OnUDPRead := readUDP.UDPRead;
  udp.DefaultPort := 2000;  // <===
  udp.Active := True;       // <===
  udp.Broadcast(cast, 1900);

RobertP 31. Aug 2007 11:45

Re: IdUDPServer.UDPRead wird nicht aufgerufen
 
Zitat:

Zitat von richard_boderich
lass mich jetzt mal raten, an port 1900 kontest du es nicht binden richtig?

Falsch geraten :wink: Ich muss es doch an den lokalen Port binden, 1900 ist doch der Remote Port. Oder?

@shmia: Dein Code geht leider auch nicht :?

Naja egal trotzdem danke euch allen für die Hilfe, ich werds jetzt eben irgendwie mit ReceiveString lösen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:29 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz