Jaffe Skrevet 17. mai 2005 Del Skrevet 17. mai 2005 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
aadnk Skrevet 17. mai 2005 Del Skrevet 17. mai 2005 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
Jaffe Skrevet 17. mai 2005 Forfatter Del Skrevet 17. mai 2005 (endret) 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 17. mai 2005 av Johan123321 Lenke til kommentar
Jonas Skrevet 18. mai 2005 Del Skrevet 18. mai 2005 (endret) Form2.Line (10,10)-(1000,1000) Prøv koden med de tallene først, og se om du får noe resultat. Endret 18. mai 2005 av Jonas Lenke til kommentar
Jaffe Skrevet 18. mai 2005 Forfatter Del Skrevet 18. mai 2005 (endret) 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 18. mai 2005 av Johan123321 Lenke til kommentar
Jaffe Skrevet 18. mai 2005 Forfatter Del Skrevet 18. mai 2005 (endret) 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 18. mai 2005 av Johan123321 Lenke til kommentar
Jonas Skrevet 18. mai 2005 Del Skrevet 18. mai 2005 (endret) 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 18. mai 2005 av Jonas Lenke til kommentar
Jaffe Skrevet 18. mai 2005 Forfatter Del Skrevet 18. mai 2005 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
aadnk Skrevet 18. mai 2005 Del Skrevet 18. mai 2005 (endret) 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 18. mai 2005 av aadnk Lenke til kommentar
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå