Gå til innhold

Anbefalte innlegg

Sliter med et lite problem her.

 

Har en linux server som står og sender ut data på en viss port

så snart eg har koble til.

 

Og det går helt smertefritt.

 

Problemet er når eg skal motta disse dataene.

 

Har nå prøvd på to forskjellige maskiner(begge med vb6 installert, og prosjektet kjøres via vb6), på disse to maskinene oppfører winsock controllen seg forskjellig.

 

Eg forventer at dataene kommer inn på denne måten:

felt: verdi<CRLF>
felt: verdi<CRLF>
felt: verdi<CRLF>
<CRLF>

 

Det går helt fint på den ene maskinen, men på den andre kommer

de slik:

felt: verdi<CRLF>felt:
verdi<CRLF>felt
: verdi<CRLF><CRLF>

 

Og i tillegg, på den første maskinen kan eg lese et slikt datasett via getdata,

men på den andre er ikke alltid alt kommet med, slik at eg kanskje må lese getdata flere ganger før eg har et datasett.

 

Neste problem er at dette ikke alltid er tilfelle på begge maskinene. Det hender faktisk at de bytter på det, eller er like ei stund.

 

PS: et datasett er fra første linje til første tomme linje.

 

Når eventen for å motta data blir utløst leser eg inn dataene fra getdata inn i ei streng, for så å sende dette til en annen funksjon, ParseData, som splitter denne strengen opp i et array(med CRLF som delimiter), og deretter sjekke at hver enkelt array har de dataene de skal ha.

 

Mistenker at eg må gjøre det på en annen måte, noen tips?

Lenke til kommentar
Videoannonse
Annonse

Problemet er at du ikke kan forvente at pakkene mottatt på klientene er likeledes med den sendte på serveren - ofte deles pakker opp i flere mindre segmenter, og disse må du selv sette sammen. Heldigvis tar TCP seg av rekkefølgen av disse pakkene, hvilket betyr at følgende kode burde fungere:

 

' Vår buffer som lagrer informasjonen midlertidig inntil vi har mottat datasettet
Dim strBuffer As String

Private Sub wckClient_DataArrival(ByVal bytesTotal As Long)

   Dim strRecived As String, Tell As Long, aDataSet
   
   ' Motta data
   wckClient.GetData strRecived

   ' Legg til dette segmentet
   strBuffer = strBuffer & strRecived
   
   ' Forsikre oss mot å motta flere datasetter
   aDataSet = Split(strBuffer, vbCrLf & vbCrLf)
   
   ' Finn så endelig ut om vi har mottat hele datasettet
   If UBound(aDataSet) > 0 Then
   
       ' Les alle datasetter som er fullførte
       For Tell = LBound(aDataSet) To UBound(aDataSet) - 1
           ParseData aDataSet(Tell)
       Next
   
       ' Det siste elementet vil ALLTID være ufullendt
       strBuffer = aDataSet(UBound(aDataSet))
   
   End If

End Sub

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...