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);
Annonceindlæg fra Academic Work Denmark A/S
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.
12. august 2005 - 08:38
#2
kan man ikke bruge ArrayList og så caste det bagefter....
12. august 2005 - 08:39
#3
du allokerer en vis buffer og så læser og processer du i et while loop
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.
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.
12. august 2005 - 08:42
#6
Desuden er størrelsen på den binære fil i de første 70 bytes...
12. august 2005 - 08:42
#7
:) - det er jo det...
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);
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 }
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);
12. august 2005 - 08:46
#11
har desværre ikke tilgang til pda'en lige nu, så jeg koder lidt i blinde
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 :^)
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?
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
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[]
12. august 2005 - 08:52
#16
ok - der er vist forvirring - prøver lige igen...
12. august 2005 - 08:53
#17
med en int32 imellem bytesene så ville jeg wrappe den Stream i en BinaryReader 100 gange nemmere !
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
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...
12. august 2005 - 08:57
#20
nu gik jeg ud fra at du ville have en TcpClient...
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 ;^)
12. august 2005 - 08:59
#22
alt i headeren skal bruges og bytesene kommer i rigtig rækkefølge - dvs ikke omvendt
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]?
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.
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);
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
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);
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 :)
12. august 2005 - 09:19
#29
ok
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.