Gå til innhold

Winsock -Hvordan sende flere variabler i en pakke?


Anbefalte innlegg

Driver å lager et lite program her, der en kjører server og den andre kobler til som klient. Da kan begge tegne, og se det den andre tegner osv., men jeg har et lite problem... X og Y kordinatene til de nye punktene som tegnes må sendes, og helst i en pakke. Hvordan kan jeg gjøre dette? Har prøvd med TYPE i både Private og Public uten hell. Prøver ca. slik:

 

Private (eller public) Type Koordinat

KX as integer

KY as integer

End Type

 

Dim Koordinat As Koordinat

 

og i sende-sub'en:

 

Koordinat.KX = X

Koordinat.KY = Y

Winsock1.SendData Koordinat

 

Får en feilmelding da...

Lenke til kommentar
Videoannonse
Annonse

Dette kan vel løses ved å benytte en såkalt Byte-array. Da kan du simpelthen avnende følgende for oversendelse:

 

' Array som inneholder informasjonen som skal oversendes

Dim bArray() As Byte

 

' Alloker array

ReDim bArray(1 To LenB(Koordinat))

 

' Kopier til array

CopyMemory bArray(1), Koordinat, LenB(Koordinat)

 

Mens følgende kan benyttes ved mottakelsen:

 

' Array som inneholder informasjonen som skal mottas

Dim bArray() As Byte

 

' Hent data

Winsock1.GetData bData

 

' Kopier tilbake igjen

CopyMemory Koordinat, bArray(LBound(bArray)), LenB(Koordinat)

 

Husk for øvrig at du må deklarere CopyMemory:

 

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long

Lenke til kommentar

Nå har jeg et nytt problem (fant ut en egen måte på det forrige, men takk for hjelpen uansett!)

 

Når jeg tegner noe i Serveren (og omvendt) viser det ikke hos Klienten! Hva er galt?

 

Private Sub tcpClient_DataArrival(ByVal bytesTotal As Long)

Dim pakke As String

tcpClient.GetData pakke

 

Dim lengd As String

Dim drx As String

Dim dry As String

Dim tegn As String

 

lengd = Mid(pakke, 1, 1)

drx = Mid(pakke, 2, lengd)

tegn = Len( drx) + 2

lengd = Len( pakke) - tegn + 1

dry = Mid(pakke, tegn, lengd)

 

Form2.Line -(drx, dry)

 

End Sub

Endret av Johan123321
Lenke til kommentar
Form2.Line (10,10)-(1000,1000)

 

Prøv koden med de tallene først, og se om du får noe resultat.

 

Ja, det funker.

 

Men da tror jeg det ville blitt streker fra punktene 10, 10 på skjermen og til der den andre (serveren / klienten) tegnet... Og for de som lurer, så er

 

lengd = Mid(pakke, 1, 1)

drx = Mid(pakke, 2, lengd)

tegn = Len( drx) + 2

lengd = Len( pakke) - tegn + 1

dry = Mid(pakke, tegn, lengd)

 

Rett. Det er bare det med Line som ikke fungerer. Har prøvd med PSET, men da ble alt helt merkelig på mottakerens skjerm.

Endret av Johan123321
Lenke til kommentar

Har funnet ut noe nytt. Den komplette sende-og-mottaks-koden er her:

 

Motta og tegne:

Dim pakke As String
tcpServer.GetData pakke

Dim lengd As String
Dim drx As String
Dim dry As String
Dim tegn As String
lengd = Mid(pakke, 1, 1)
drx = Mid(pakke, 2, lengd)
tegn = Len(drx) + 2
lengd = Len(pakke) - tegn + 1
dry = Mid(pakke, tegn, lengd)

Form2.Line -(drx, dry)

 

Sende:
   Dim strdata As String
   
   If tegner = False Then Exit Sub
   If Y > 4800 And Button = vbLeftButton Then
   tegne = False
   Else
   tegne = True
   End If
   
   If tegne = True And Button = vbLeftButton Then
       Line -(X, Y)
   Dim pakke As String
   Dim drx As String
   Dim dry As String
   drx = X
   dry = Y

   pakke = Len(drx) & Len(dry) & drx & dry   ' no er pakke 3235423
   tcpClient.SendData pakke
   End If

 

Problemet er at DRX (X-koordinat) av og til er fks. 15-5 osv når det mottas. Hva skyldes dette? At pakken korrupteres ved sending?

Endret av Johan123321
Lenke til kommentar

Du sender og motar på en dårlig måte. Hva om lengen er over et tegn? (Og du har tydeligvis et problem der)

 

Slik ville jeg har sendt:

tcpClient.SendData drx & "|"  & dry 

Og slik ville jeg mota:

Dim pakke As String, SplitBuff

tcpServer.GetData pakke

 

SplitBuff = Split(pakke, "|")

 

Form2.Line -(SplitBuff(0), SplitBuff(1)) 

Endret av Jonas
Lenke til kommentar

Takk Jonas, nå funker programmet ypperlig! Har testa med meg selv, og da vises tegningene fint, men når jeg tester på nettet, med en annen, blir tegningen hans helt rar, med mange streker osv. er dette pga. responstiden over internett, eller? Og hvordan fikser jeg det?

Lenke til kommentar

Over internett kan mange pakker forsvinne eller komme samlet i ett. Dette tar normalt TCP-protokollen seg av automatisk, men du kan dog risikere å få innsendt flere pakker SAMTIDIG, slik at flere vil eksisterere i strengen. Det du da bør gjøre, er å atskille kommandolinjene på en bedre og mer robust måte; ved benyttelse av en skilletegn, eksempelvis vbCrLf, kan du sende kommanoder således:

 

' Send kommandolinje

tcpClient.SendData drx & "|"  & dry & vbCrLf

 

For å motta kommandoene, må du gjøre som følger:

 

Dim Pakke As String, Lines, SplitBuff, Tell As Long

 

' Hent pakkedata

tcpServer.GetData Pakke

 

' Splitt deretter opp pakken i segmenter etter skilletegnet

Lines = Split(sBuffer & Pakke, vbCrLf)

 

' Vi må ha mer enn èn linje for at vi i det hele tatt har mottatt en kommmando

If UBound(Lines) > 0 Then

 

    ' Eksekver hver linje utenom den siste

    For Tell = LBound(Lines) To UBound(Lines) - 1

 

        ' Splitt opp linje, slik at vi kan lese kommandoen

        SplitBuff = Split(Lines(Tell), "|")

   

        ' Utfør kommando

        Form2.Line -(SplitBuff(0), SplitBuff(1))

 

    Next

 

    ' Nullstill buffer

    sBuffer = ""

 

End If

 

' Siste element skal overføres til neste sesjon

sBuffer = Lines(UBound(Lines))

 

Husk at du må deklarere bufferen øverst i formen:

 

Dim sBuffer As String

Endret av aadnk
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å
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...