[Delphi] Antwoord lezen van UDP broadcast met idUDPClient

Pagina: 1
Acties:
  • 287 views sinds 30-01-2008
  • Reageer

  • Mayco
  • Registratie: Augustus 2002
  • Laatst online: 05-05 08:13
Ok, ik zit met een probleempje...
Ik heb client-applicaties en server-aplicaties
Ik moet dus de servers ontdekken op het netwerk, door middel van broadcasting... Nu kan ik het bericht wel broadcasten, en de servers lezen het, en kunnen ook terugsturen, maar dat teruggstuurde bericht komt nooit aan... Ik gebruik een idUPDClient component voor het broadcasten, een idUDPServer zou beter zijn, maar er draait al een idUDPServer op de computer (de serverapp) en er mag er maar een zijn. Gelukkig kan een idUDPClient ook ontvangen (binnen de timeout, dus niet constant zoals de idUDPServer), maar daar gaat dus iets mis...

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
procedure TMainFrm.Button1Click(Sender: TObject);
var
  str: String;
  ip: string;
  port: Integer;
begin

  UDPClient.Broadcast('HELLO?',8000);

  Memo1.Lines.Add('-start');

    repeat
      try
        str := UDPClient.ReceiveString(ip, port);
      except
        on E: EIdSocketError do
          if E.LastError <> 10040 then
            raise;
      end;

    if port <> 0 then
    begin
      memo1.Lines.add('----------');
      memo1.Lines.Add(str);
      memo1.Lines.Add(ip);
      memo1.Lines.Add(inttostr(port));
    end;
  until str = '';
  Memo1.Lines.Add('-stop');
end;

deze code stuurt dus een bericht, en wacht dan tot de timeout van de idUDPClient voorbij is. (5000 milliseconden). De repeat zorgt ervoor dat er niet na het eerste antwoord wordt gestopt (er kunnen natuurlijk meerdere servers zijn).

code:
1
2
3
4
5
6
7
8
9
10
11
12
procedure TMainFrm.IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
  ABinding: TIdSocketHandle);
var
  DataStringStream : TStringStream;
begin
  DataStringStream := TStringStream.Create('');
  DataStringStream.CopyFrom(AData, AData.Size);

  if DataStringStream.DataString = 'HELLO?' then
    idUDPServer1.Send(ABinding.PeerIP, ABinding.Port, 'HELLO!');
  DataStringStream.Free;
end;

ja, en dit stuurt gewoon HELLO! terug als het HELLO? ontvangt.

iemand een idee? de fout zit hem dus in dat "str := UDPClient.ReceiveString(ip, port);" niets teruggeeft...

  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Zoeken leverde mij 1 hit op:
http://www.kquery.com/for...796ff8e7909&showtopic=400

Als ik de code van "TheOne" (bijna onderaan) vergelijk met wat jij doet, zie ik dat hij voor zn receive actie het poortnummer instelt. Dit mis ik in jouw code. Nu kan ik me vergissen natuurlijk, ik heb noch Delphi nog idUDPClient ervaring, dus hou me ten goede :)

  • Mayco
  • Registratie: Augustus 2002
  • Laatst online: 05-05 08:13
de port stond al juist in het component zelf... 8000 dus...
toch bedankt voor de reactie!