Avatar billede ttc Nybegynder
27. januar 2004 - 14:42 Der er 8 kommentarer og
1 løsning

socket og string

hej alle..

sider og roder med lidt socket programmering i delphi,men er løbet ind i lidt af et problem..

kan godt få programmet til at sende og modtage en tekst string. det jeg gerne vil kunne er at sende flere informationer

fx. sende teksten "192.162.10.1|tell|test test"

hvor er bruger "|" som skel mellem de informationer jeg sende...


håber i kan hjælpe mig
/TTC
Avatar billede Slettet bruger
27. januar 2004 - 14:46 #1
Avatar billede ttc Nybegynder
27. januar 2004 - 14:52 #2
hejhej >> hmm. har lige kigget lidt på den men fatter minus...
Avatar billede Slettet bruger
27. januar 2004 - 15:36 #3
Prøv det her:

function Parse(Char, S: string; Count: Integer): string;
var
  I: Integer;
  T: string;
begin
  if S[Length(S)] <> Char then
    S := S + Char;
  for I := 1 to Count do
  begin
    T := Copy(S, 0, Pos(Char, S) - 1);
    S := Copy(S, Pos(Char, S) + 1, Length(S));
  end;
  Result := T;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  text, ip, s1, s2: String;
begin
  text := '192.162.10.1|tell|test test';
  ip := Parse('|', text, 1);
  s1 := Parse('|', text, 2);
  s2 := Parse('|', text, 3);
  ShowMessage(ip);
  ShowMessage(s1);
  ShowMessage(s2);
end;

Det deler strengen op i 3 dele.
Avatar billede ttc Nybegynder
28. januar 2004 - 12:12 #4
tak for hjælpen hejhej

det tog noget tid for mig at se hvordan jeg kunne bruge kode stumpen
men kom frem til en løsning kl 3 i nat...

kan du ikke smide et svar så du kan få nogle point...

min løsning blive..

procedure TForm1.Button1Click(Sender: TObject);
var
  Text, str1: string;
  Resive: TStringList;
  C: Integer;

begin
  Text := '192.162.10.1|user|';
  C:= 1;

  Resive:= TStringList.Create();
      while C > 0 do
        begin
          str1 := Copy(Text, 0, Pos('|', Text) - 1);
          Text := Copy(Text, Pos('|', Text) + 1, Length(Text));

          if Length(str1) > 0 then
            begin
              Resive.Insert(C-1,str1);
              RichEdit1.Lines.Add(str1);
              C:= C+1;
            end
          else
            begin
              C:= 0;
            end;
        end
end;
Avatar billede hrc Mester
28. januar 2004 - 12:13 #5
Hvorfor ikke bare starte med en størrelsesheader på eks. 4. bytes der fortæller hvor lang resten af dataklumpen er. Denne klump består af 0 terminerede strenge (det kan tit betale sig at konvertere heltal til strenge, især hvis man kører fra endian til non-endian maskiner så slipper man for en masse bøvl. Tit er tallene også så små, at de fylder mindre end de normale 4/8 bytes)

Som afslutning bruges en dobbeltterminering (2 #0'er)

Vha. pchars kan du lynhurtigt parse data (pseudo-kode):

const
  Data = 'Dette'#0'er'#0'en'#0'test'#0#0;
var
  st : string;
  p, pc : pchar;
  size : integer;
begin
  ReadSocket(size,sizeof(integer));
  getmem(p,size);
  try
    ReadSocket(p^,size);
    pc := p;
    while pc <> #0 do begin
      Memo1.Lines.Add(string(pc));
      pc := strend(pc)+1;
    end;
  finally
    freemem(p);
  end; // try
end;
Avatar billede ttc Nybegynder
28. januar 2004 - 12:44 #6
hej Hrc

lyder som en meget gode iden.. har lige prøvet den
dog uden at få den til at virke *øv*

den kender ikke noget til ReadSocket
Avatar billede hrc Mester
28. januar 2004 - 20:17 #7
Hej tcc. Som jeg skrev i parantesen, så var det pseudokode idet jeg ikke havde navnet på socketkomponenten - her improviserede jeg. Er dog ret sikker på at den virker på denne streamagtige måde.
Avatar billede ttc Nybegynder
26. oktober 2004 - 10:42 #8
.
Avatar billede hrc Mester
26. oktober 2004 - 11:09 #9
Ærgerligt at min metode ikke duede til dit dit behov.

Hvis du kommer til at skulle sende strenge og andet data gemmen en stream, så prøv at leg lidt med TFiler-objekterne (TReader og TWriter). De er meget lette at arbejde med og de indkapsler det jeg forsøgte at "sælge" dig.
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