Avatar billede spif2001 Nybegynder
12. august 2005 - 08:31 Der er 28 kommentarer og
1 løsning

Størrelsen af byte[] modtaget fra socket

Hej

Har en TcpListener der accepterer en socket. Når jeg skal læse hvad den socket sender gør jeg således:

byte[] header = new byte[72];
this.client.Receive(header);

det er også fint, da jeg ved at clienten sender mig 72 byte, men anden gang sender clienten et ukendt antal bytes (han sender 70 byte + indholdet af en binær fil).

Hvordan får jeg lige lavet størrelsen på mit byte[], når jeg ikke ved hvor meget clienten sender?

Kan jo desværre ikke nøjes med følgende, da arrayet så ikke bliver initialiseret:

byte[] data;
this.client.Receive(data);
Avatar billede nielle Nybegynder
12. august 2005 - 08:37 #1
Har du selv styr over klienten? For så kunne du jo lade denne fortælle sreveren hvor stor den binære fil er.
Avatar billede Syska Mester
12. august 2005 - 08:38 #2
kan man ikke bruge ArrayList og så caste det bagefter....
Avatar billede arne_v Ekspert
12. august 2005 - 08:39 #3
du allokerer en vis buffer og så læser og processer du i et while loop
Avatar billede spif2001 Nybegynder
12. august 2005 - 08:40 #4
nja - clienten eksisterer og har gjort det længe (det er en færdig PDA app.). Den snakker med samme protokol med et c++ program, og derfor skal jeg "bare" bruge samme protokol.
Avatar billede akempff Nybegynder
12. august 2005 - 08:41 #5
HVad ligger der i den 72 bytes header? Det ville jo være oplagt at lægge størrelsen der.
Avatar billede spif2001 Nybegynder
12. august 2005 - 08:42 #6
Desuden er størrelsen på den binære fil i de første 70 bytes...
Avatar billede spif2001 Nybegynder
12. august 2005 - 08:42 #7
:) - det er jo det...
Avatar billede spif2001 Nybegynder
12. august 2005 - 08:44 #8
Kan man gøre således?:

byte[] data= new byte[70];
this.client.Receive(data,0,70,SocketFlags.Partial);

//finde filstørrelse

byte[] file= new byte[size];
this.client.Receive(file,0,70,SocketFlags.Partial);
Avatar billede arne_v Ekspert
12. august 2005 - 08:44 #9
så:

byte[] b = new byte[1000];
int n;
while((n = s.Receive(b)) > 0)
{
    // process n bytes i b
}
Avatar billede spif2001 Nybegynder
12. august 2005 - 08:45 #10
ups:

byte[] data= new byte[70];
this.client.Receive(data,0,70,SocketFlags.Partial);

//finde filstørrelse

byte[] file= new byte[size];
this.client.Receive(file,size,SocketFlags.Partial);
Avatar billede spif2001 Nybegynder
12. august 2005 - 08:46 #11
har desværre ikke tilgang til pda'en lige nu, så jeg koder lidt i blinde
Avatar billede nielle Nybegynder
12. august 2005 - 08:46 #12
Ja, hvia filstørelsen allerede er angivet i headeren - de første 70 bytes - så er det jo oplagt at aflæse den derfra :^)
Avatar billede nielle Nybegynder
12. august 2005 - 08:48 #13
Hvis du ikke har PDA'en , og du ikke har en beskrivelse af hvor størrelsen lgger i denne, så så koder du godt nok i blinde. ;^)

Ved du hvor den starter og hvor mange bytes den fylder?
Avatar billede arne_v Ekspert
12. august 2005 - 08:50 #14
hvis du kender størrelsen så er det:

byte[] b = new byte[siz];
int ix = 0;
int n;
while((n = s.Receive(b, ix, b.Length - ix, SocketOptions.Xxxxx)) > 0)
{
    ix += n;
}
// process b
Avatar billede spif2001 Nybegynder
12. august 2005 - 08:51 #15
jojo - jeg ved hvor størrelsen er, jeg kan bare ikke teste det jeg laver lige nu.

størrelsen er en Int32 der ligger på plads 66-69 i det første byte[]
Avatar billede spif2001 Nybegynder
12. august 2005 - 08:52 #16
ok - der er vist forvirring - prøver lige igen...
Avatar billede arne_v Ekspert
12. august 2005 - 08:53 #17
med en int32 imellem bytesene så ville jeg wrappe den Stream i en BinaryReader

100 gange nemmere !
Avatar billede spif2001 Nybegynder
12. august 2005 - 08:56 #18
jeg får tilsendt 70 bytes + en fil - eksempelvis ialt 1070 bytes.

på plads 66-69 er en int32 der fortæller hvor stor filen er - i eksemplet 1000.

Kan jeg så gøre følgende:


byte[] data= new byte[70];
this.client.Receive(data,0,70,SocketFlags.Partial);

//finde filstørrelse

byte[] file= new byte[size];
this.client.Receive(file,size,SocketFlags.Partial);

eller skal jeg gøre som arne_v på denne facon:


byte[] data= new byte[70];
this.client.Receive(data,0,70,SocketFlags.Partial);

//finde filstørrelse (siz)

byte[] b = new byte[siz];
int ix = 0;
int n;
while((n = s.Receive(b, ix, b.Length - ix, SocketOptions.Xxxxx)) > 0)
{
    ix += n;
}
// process b
Avatar billede spif2001 Nybegynder
12. august 2005 - 08:57 #19
--> har jeg og det virker - men jvf. mit problem forleden med, at jeg ikke kan få fat i clientens IPAdresse så, da er jeg nødsaget til at bruge Socket...
Avatar billede spif2001 Nybegynder
12. august 2005 - 08:57 #20
nu gik jeg ud fra at du ville have en TcpClient...
Avatar billede nielle Nybegynder
12. august 2005 - 08:58 #21
Hvis det kun er den ene Int32 der ønskes, men at resten af headeren ellers er uinteressant, så er det vel stort set hip-som-hap hvordan man gør det.

int FileSize = 16777216 * b[66] + 65536 * b[67] + 256 * b[68] + b[69].

(under forudsætning af at bytesene ikke sendes i modsat rækkefølge ;^)
Avatar billede spif2001 Nybegynder
12. august 2005 - 08:59 #22
alt i headeren skal bruges og bytesene kommer i rigtig rækkefølge - dvs ikke omvendt
Avatar billede nielle Nybegynder
12. august 2005 - 09:00 #23
... samt den lille detalje at arrayet jo starter på indeks 0 - så er plads nr. 66 så b[66] eller b[65]?
Avatar billede nielle Nybegynder
12. august 2005 - 09:02 #24
Hvis alt i headeren skal bruges så er det, som arne_v siger, en rigtig god ide at pakke det ind i en BinaryReader.
Avatar billede arne_v Ekspert
12. august 2005 - 09:02 #25
nej

du kan

BinaryReader  br = new Binary Reader(new Networktream(dinsocket));

og så bruge:

int siz = br.ReadInt32();
byte[] b = new byte[size];
int n = br.Read(b);
Avatar billede spif2001 Nybegynder
12. august 2005 - 09:03 #26
i arrayet er der fra plads 0 og op:
short - 2 bytes
int - 4 bytes
char[] - 60 bytes
int - 4 bytes

sidste int er størrelsen
Avatar billede arne_v Ekspert
12. august 2005 - 09:06 #27
eller endnu nemmere

int siz = br.ReadInt32();
byte[] b = br.Read(siz);

og det er nemt at skippe nogle bytes:

br.Read(notwantedbytes);
Avatar billede spif2001 Nybegynder
12. august 2005 - 09:07 #28
ah - se det ser jo mere tilforladeligt ud - lægger du et svar arne, så kan det være der kommer en tillægskommentar hvis det bøvler :)
Avatar billede arne_v Ekspert
12. august 2005 - 09:19 #29
ok
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