Avatar billede staever Nybegynder
19. februar 2007 - 12:43 Der er 11 kommentarer og
1 løsning

Socket overførelse

Jeg er ved at lave et program med Socket overførelse, hvor jeg skal kunne sende data af variabel længde. Jeg har en buffer på 256 byte, men kan i nogen tilfælde komme ud for at skulle modtage mere data end der kan være heri på én gang, hvorfor jeg ønsker at læse videre. Indtil videre har jeg forsøgt med nedenstående kode, men kan ikke rigtig få det til at virke.

Nogen forslag til forbedring?

--- kode start ---

byte[] b = new byte[256];
string line = null;
                   
Int32 n = s.Receive(b, b.Length, 0);
line += Encoding.ASCII.GetString(b, 0, n);

while (n > 0)
{
  n = s.Receive(b, b.Length, 0);
  line += Encoding.ASCII.GetString(b, 0, n);
}

MessageBox.Show("Line: " + line.Length.ToString());

--- kode slut ---

line variablen er det modtagne som jeg ønsker at anvende senere i mit program.
Avatar billede Slettet bruger
19. februar 2007 - 12:52 #1
Hmm, når modparten sender bliver det jo lagt i en buffer, her læser du bare 256 bytes ad gangen, så hvis der ligger mere end 256 læser du jo bare videre næste gang`?
Avatar billede staever Nybegynder
19. februar 2007 - 13:00 #2
Ja det har du ret i, men hvordan finder man så enden på lige præcis én specifik sætning?

hvis jeg fx. sender følgende 3 sætninger:

auth staever
msg 123456789 (indeholdende over 256 tegn)
quit

hvordan kan jeg så læse præcis det rigtige antal tegn i den midterste sætning, uden at få noget med fra den 3.?
Avatar billede Slettet bruger
19. februar 2007 - 13:07 #3
Det kan du ikke umidlbart. I hvilken sammenhæng skal du bruge det?
Avatar billede staever Nybegynder
19. februar 2007 - 13:08 #4
Er som en server del, hvor en klient kan logge på, og sende data, med ovenstående kommandoer ... man kan vel egentligt godt sende først hvor meget data der kommer i alt istedet så?
Avatar billede Slettet bruger
19. februar 2007 - 13:13 #5
Altså jeg bruger nogenlunde samme system i et p2p jeg er i gang med. Der har jeg brug for at sende alle shares til server, og der laver jeg først en lang streng med alle filerne og så sender med en special karakter til sidst for at vise at her slutter det.

Når server modtager lægger den så dele af strengen i et StringBuilder objekt og kigger efter om den sidste karakter er den vi leder efter.

f.eks

?SendShares#(meget-lang-streng) + "*"

? betyder det er en command, # betyder start på argument. Så lægger den argument i StringBuilder objektet indtil den ser den sidste karakter er *

Giver det mening?
Avatar billede staever Nybegynder
19. februar 2007 - 13:18 #6
ah ja, det giver helt klart mening ... det lyder faktisk som en god idé. Så er det jo bare at holde øje med hvornår der kommer en afsluttende karakter :)
Avatar billede Slettet bruger
19. februar 2007 - 13:21 #7
Præcis :)
Avatar billede Slettet bruger
19. februar 2007 - 13:21 #8
smider lige et svar
Avatar billede staever Nybegynder
19. februar 2007 - 13:58 #9
jeg takker for svaret :)
Avatar billede arne_v Ekspert
19. februar 2007 - 17:14 #10
det er forholdsvis almindeligt at bruge \r\n som seprator
Avatar billede Slettet bruger
19. februar 2007 - 19:47 #11
hvad er det \r betyder?
Avatar billede arne_v Ekspert
19. februar 2007 - 19:52 #12
\r = Car Return
\n = New Line
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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