Avatar billede sorenriis Nybegynder
16. februar 2006 - 14:28 Der er 15 kommentarer og
1 løsning

Få fat i data fra UDP-server

Version: Delphi 2005 og Indy 10.1.5

En dedikeret server giver respons fra sig, hvis man sender en bestemt streng til den via UDP. Dette gør jeg via Indys UDPClient.

Mit problem er nu hvordan jeg behandler den data, der kommer retur fra serveren. Den sender nemlig nogle data tilbage, som jeg er interesseret i at få fat i.

Bruger jeg UDPClient.RecieveString() kan jeg kun læse den første del af "datapakken" og jeg får derfor kun udlæst teksten "rFactor".

Den datapakke der kommer retur har jeg uploaded her:
http://www.f1challenge.dk/rFactor (kun data-delen).

Hvordan får jeg indlæst de "tekstbidder" jeg er interesseret i - hvis det overhovedet er muligt?
Det jeg er interesseret i at læse i det ovenstående tilfælde er "OWChallenge05rfm", "testtest", "Essington Grand Prix" og "This is the default message of the day".

På forhånd tak,
Søren
Avatar billede dkn Nybegynder
16. februar 2006 - 14:34 #1
Prøv med evt. med en UDPserver istedet. Brug OnRead event.
Avatar billede sorenriis Nybegynder
16. februar 2006 - 14:51 #2
Hvordan ville du lave koden under OnRead-event?
Avatar billede dkn Nybegynder
16. februar 2006 - 15:20 #3
uses IdGlobal;

procedure TForm1.UDPUDPRead(Sender: TObject; AData: TBytes;
  ABinding: TIdSocketHandle);
var
  S:string;
begin
S := PChar(AData);
showmessage(S);
end;
Avatar billede sorenriis Nybegynder
16. februar 2006 - 15:28 #4
Har lige prøvet dit forslag. Den modtager desværre intet, selvom jeg kan se vha. Ethereal at pakken med data ankommer som den skal. Programmer opfanger den bare ikke.
Avatar billede dkn Nybegynder
16. februar 2006 - 15:32 #5
har du en ip man kan prøve at teste til ?
Avatar billede sorenriis Nybegynder
16. februar 2006 - 15:45 #6
Serveren står desværre på mit lokalnetværk, som "udefrakommende" ikke kan få adgang til (kollegienet).

Hvis det kan hjælpe noget, så er her hele pakken der modtages fra serveren:
http://www.f1challenge.dk/rFactor.txt
Avatar billede dkn Nybegynder
16. februar 2006 - 15:57 #7
okay, ja fordi den ikke viser noget er måske fordi pakken starter med #0 vil jeg tro.
Men den skulle nu stadig vise en besked, bare uden tekst måske.

Har du nogen protocol over det info den sender? Gør det lidt nemmere hvis man skal pakke det ud.
Avatar billede sorenriis Nybegynder
16. februar 2006 - 16:05 #8
Der kommer slet intet "Showmessage"-vindue. Så det betyder vel at den ikke modtager nogen data. Skal UDPServeren sættes op på en speciel måde ud over at sætte porten til 34297?

Jeg har ingen protocol-info over det den sender - ud over hvad du har fået.
Avatar billede dkn Nybegynder
16. februar 2006 - 16:55 #9
ja det skulle der nemlig.

Du sætter bare Bindings til "0.0.0.0:34297"

//- connect

  UDP.Active := true;
  try
    UDP.Send(ip, port, 'data');
  except
    on E: Exception do showmessage(E.Message + ' Cant Send Packet !!! ');
  end;
Avatar billede dkn Nybegynder
16. februar 2006 - 16:57 #10
eller det kan egentlig gøre lige meget hvad den binding står til...
Avatar billede sorenriis Nybegynder
16. februar 2006 - 17:08 #11
Samme problem.

Jeg prøvede så det her:

procedure TForm1.Button1Click(Sender: TObject);
var
  text: Integer;
begin
  try
    UDPClient2.Send('192.168.1.101',34297,'stats');
    text:=Length(UDPClient2.ReceiveString());
    Memo1.Lines.Add(IntToStr(text));
  except
    on E: Exception do showmessage(E.Message + ' Cant Send Packet !!! ');
  end;
end;

Dette skriver i Memo'en "621" - altså præcist størrelsen på den datamængde serveren sender. Hvorfor er det så lige at den kun skriver "rFactor", hvis jeg prøver at skrive det modtagede til Memo'en?
Avatar billede dkn Nybegynder
16. februar 2006 - 17:15 #12
Det er fordi delphi string slutter af med chr(0), dvs den tror strengen er slut.
Det er et meget træls problem specielt med sådan nogle ting her.

Du kan godt arbejde med strengen copy,pos, length osv. Det er bare når du vil smide det ud det giver probs.

prøv fx at smid teksten igennem noget lign. showmessage(stringreplace(data, #0, #255, [rfreplaceall]));
Avatar billede sorenriis Nybegynder
16. februar 2006 - 17:30 #13
Jeg kunne ikke lige få stringreplace til at virke, så jeg prøvede dette:
UDPClient2.Send('192.168.1.101',34297,'stats');
position:=AnsiPos('testtest', UDPClient2.ReceiveString());
ShowMessage(IntToStr(position));
Linjen der findes, men den returnere position=0, så det virker ikke.

Skriver jeg derimod:
position:=AnsiPos('rFactor', UDPClient2.ReceiveString());
Her returnerer den position=1, som den skal.
Avatar billede sorenriis Nybegynder
16. februar 2006 - 17:32 #14
Nå.. den kan finde "testtest", hvis jeg bruger Pos istedet for AnsiPos.
Hvordan får jeg nu lettest de data ud jeg skal bruge?
Avatar billede sorenriis Nybegynder
02. november 2006 - 21:16 #15
Lukker spørgsmålet.. Afgiv svar, hvis I vil have del i points :)
Avatar billede sorenriis Nybegynder
18. december 2006 - 14:12 #16
Lukket..
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester