Avatar billede insaneboy Nybegynder
14. juni 2004 - 12:24 Der er 4 kommentarer og
1 løsning

Opbygning af en protokol

Jeg er ved at lave et program der skal kommunikere med en klient. Jeg skal selv definere protokollen, og jeg har valgt at gøre dette med nogle forskellige records jeg fylder ud, alt efter hvilke data jeg skal sende (om det er tekst, nogle små flags osv.). Jeg er bare ikke så erfaren med hensyn til opbygningen af en effektik måde at læse pakkerne på (bruger en masse if-sætninger efter hinanden, virker lidt slamkodeagtigt :)). Er der nogen der kender nogle eksempler på hvordan dette gøres effektivt?
Avatar billede bufferzone Praktikant
14. juni 2004 - 14:13 #1
En protokol defineres i en såkaldt RFF (Request for comments). Du kan ved at søge i google finde RFC for alle protokoller ved at søge på RFC + protokolnavn

Jeg har her fundet FTP RFC'en som du måske kan bruge som insperation, ellers find en anden

http://www.w3.org/Protocols/rfc959/Overview.html
Avatar billede hrc Mester
14. juni 2004 - 23:41 #2
Jeg har lavet en del indlæg om det her på eksperten (kører lidt rundt i samme spor, men det er et interessant emne, ikke???).

Jeg ville ikke bruge faste records. Jeg ville streame data frem og tilbage fordi:
1. Der er ingen begrænsning på data. En streng kan være 32 tegn lang eller 2Gb
2. Der er ingen spild. Hvis du har en record som ligner dette:

TPerson = record
  Name : string[50];
  Address : string[50];
  osv..
end;

så er der meget spildt hvis personen hedder "Ib Bye" og bor i "He" (i Midt-og Vestjylland). Det er der ikke når der streames med nul-terminerede strenge.

Det er let at streame data i forbindelse med objekter. Se evt. http://www.eksperten.dk/spm/505203#rid4687035 hvor der streames en liste bestående af objekter der alle selv håndterer hvordan de skal gemmes. Jeg overvejer dog igen at bruge records (fordi sådan gør andre):

TPerson = record
  Size : integer;
  Name : string;
  Address : string;
  ...
end;

Inden man gemmer data skal man sætte size og når man læser så kan man enten læse en blok af data eller starte med at læse de første 4 bytes der fortæller hvor meget recorden fylder bagefter.

Jeg holder bare stadig af min klasse med properties, der alle ved hvordan de skal læse og skrive sig selv fra og til en stream. Gider ikke have en recordstruktur og en klasse der datamæssigt er dubbleret og den sparer jeg ved at skrive data som i ovenstående link.

Grundideen er i øvrigt ens med at gemme strenge som ASCII-Z (nul-terminerede), altså uden længdeangivelse, men med en #0 i enden. Størrelsen på tal og strukturer gemmes vha sizeof(). Data starter med en længdeangivelse efterfulgt af en størrelse - jeg skipper bare recorden.

Al denne snak om at streame records er en facet af samme sag, nemlig at sende data frem og tilbage i en stream. Mit eksempel gør det til en fil - men set virker sikkert ligeså godt med en socket-stream.
Avatar billede hrc Mester
14. juni 2004 - 23:52 #3
Jeg har en kollega der ikke tør tro på at sockets altid er korrekte (hvilket ellers er noget af det vigtigste med sockets - og siden konceptet startede med unix for laaang tid siden så er det vist ret gennemprøvet). Derfor propper han en identifikationstreng foran alle pakker som sendes frem og tilbage, eksempelvis "DATADATA" således, at han er sikker på at data er synkroniseret. Hvis han ikke starter med at læse "DATADATA" så er data korrupt.

Nu er der to slags sockets anvendt og jeg kan ikke huske hvad de hedder. Jeg bruger den ene som netop burde være helt sikker, mens den anden socket-type langtfra er det.

Jeg synes det er overkill, men måske er der andre på Eksperten som har oplevet at pakker går ud af synkronisering?
Avatar billede insaneboy Nybegynder
15. juni 2004 - 16:34 #4
bufferzone: Sorry, var ikke lige det jeg ledte efter, mere noget eksempel på programkode.. Men ellers mange tak :)

hrc: Interessant læsning, tak skal du have :)
Avatar billede insaneboy Nybegynder
15. juni 2004 - 16:36 #5
Forresten. når du snakker om pakker der ikke er synkroniserede, mener du så ligesom at Winsock samler flere beskeder i samme netværkspakke, så dine beskeder kommer til at havnge lige efter hinanden i din buffer?
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