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...
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).
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...
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...