Hur får man winsock kontrollen att inte buffra...för när jag försöker skicka en stäng för ofta så skickas tex. "123;123123;123123;123123;123" men jag vill att den skall skicka "123;123" och sedan "123;123"...får det inte att fungera på det sättet. jag vill skicka varje 100mS högst...hellre var 50mS.. Hej Hallå! Hej. hmm...men jag vet ju inte hur stor datan jag tar emot är...eftersom den datan jag tar emot är mus kordinaterna... Hej OK problemet beror förmodligen på att du bara skickar data på servern ganska smart =) men jag tvivlar på att detta gör att jag kan skicka oftare än var 400-500 mS =( tack så jätte mycket...har man lärt sig nått nytt =) det fungerar perfekt...synd bara att den tar upp 80 Kb/s i bandbred för tillfället för nu skickar den så fort den fått meddelande om att det förra kommit fram =) men men det bli säkert jätte bra när man testar att köra det över modem =) Ett sätt att snabba upp det på är att skicka mera data per sändning. Kan man inte skicka Kordinaterna som binärdata? Stränga slukar ju onödigt med minne för tal. Typ använder ju 10 av 256... Vet inte men jag har för mig att man måste skicka som sträng??? någon som vet något annat kanske??????Buffert & Winsock
MVH Gabriel MedinaSv: Buffert & Winsock
Jag har testat att skicka en string mha winsockkomponenter.
I timern skickar jag datat.. I winsock1_dataarrival skriver jag ut detta data till ett textfönster. Jag har testat ner till 10ms och vad jag kan se får jag aldrig utskrift av mer än en sträng..
Vad gör du med datat som kommer till winsock1_dataarrival ??
NettanSv: Buffert & Winsock
Detta är koden i Dataarrival...
----Code----
Dim strNewData As String
Dim strNewData2 As String
wskServer2.GetData strNewData2
strNewData = strNewData2
xy.x = Left(strNewData, InStr(1, strNewData, ";", vbTextCompare) - 1)
xy.y = Right(strNewData, Len(strNewData) - InStr(1, strNewData, ";", vbTextCompare))
SetCursorPos xy.x, xy.y
-----End-----Sv: Buffert & Winsock
När servern tar emot data i data_arrival eller data_arrived elöler vad den heter så får du med en parameter bytesTotal som talar om hur mycket data som kom i den aktuella sändningen.
Genom att skicka med denna parameter i getData-metoden talar du om
hur mycket data du vill läsa. Då uppstår inte problemet att din kod haltar på det sättet.
/peterhSv: Buffert & Winsock
Sv: Buffert & Winsock
Om du skickar MusData så är data av typ Single som
kan vara max 7 tecken. Vet inte om det är helt Ok men
jag skulle omvandla x y koordinterna till String
därefter Ta Len(Cstr(x) och Len(Cstr(y))
Nu vet du hur många byte dom är ,kan kanske bli strul med
unicode som är dubbelt så stor.
spånar
SvenSv: Buffert & Winsock
och kallt räknar med att den hinner processa det innan nästa sändning.
TCP/IP - kommunikation bör fungera som halv duplex. Det vill säga som
en normal konversation. Klienten ber att få prata mes servern. Servern
å sin sida säger hej till klienten (handskakning). Klienten ber servern göra något.
Precis som två tennisspelare som slår en boll mellan sig. Det du gör i ditt
program är att slå en massa tennisbollar på servern. Den hinner inte behandla
(returnera) alla till dig.
Du måste upprätta ett protokoll som både servern och klienten följer.
När två spelare spelar tennis följer dom ju vissa regler. Bara använda
en boll som skall slås mellan varandra på ett regelmässigt sätt.
Samma sak gäller för dig när du skriver dina winsock-program. För att
de skall fungera tillförlitligt krävs det ett protokoll.
När ett protokoll är upprättat så vet du att servern har tagit emot och behandlat ditt data i och med det att du får ett svar.
Lycka till Peterh.Sv: Buffert & Winsock
Skall se...finns det inget snabbare sätt att kommunicera än att använda winsock?
MVH Gabriel MedinaSv: Buffert & Winsock
men än en gång så har man lärt sig nått nytt...hade inte kommit på tanken tidigare att använda mig av protokol =( men men...tack så jätte mycket!!!
MVH en klokare (kommande) programerare =)Sv: Buffert & Winsock
Gör en egen cyklisk mottagarbuffert. Då kan din klient och din server
släppas fria att surra på så fort dom vill.
Alltså en egen "tillräckligt stor cyklisk" mottagarbuffert, och skicka mera
data per sändning. Din overhead blir då mindre och den totala överföringshastigheten bli högre.
För att ytterligare säkerställa tillförlitligheten är det bra att alltid lägga en viss sekvens av tecken till det du skickar. Vanligast är att lägga
vbCR, vbLF eller vbCrLf till ditt data du skickar. servern har då en rimlig
chans att avgöra vad som hör till en sändning eller en annan.
En annan mycket trevli egenskap du erhåller genom att avgränsa varje sändning
med just vbCrLf är att du enkelt kan debugga ditt program genom att helt
enkelt telnetta till det. >>>> telnet 127.0.0.1 2000 (eller vilken port du nu använder).
Då kan du prata med din server genom ditt angivna protokoll, och enkelt
debugga din applikation. Din server kommer svara på dina kommandon.
Om du istället vill sänka hastigheten för överföringen så använder du dig
enklast av en loop före metoden senddata.
Gör så här:
Option Explicit
Private holdWsc As Boolean
Private Sub Form_Load()
'// Initiera timern
Timer1.Interval = 500
Timer1.Enabled = True
End Sub
Private Sub Timer1_Timer()
holdWsc = False
End Sub
Private Sub sendData(data As String)
While holdWsc = True
DoEvents
Wend
Wsc.sendData "Data att skicka"
holdWsc = True
End Sub
OBSERVERA att funktionen utan returvärde (subrutinen) sendData är ett
substitut för den kod du använder i ditt program. Men i princip kommer
detta att funka som en metronom och hålla takten i din kommunikation.
Ett annat sätt att lösa det på är att istället för koden ovan även skapa en
cyklisk sändarbuffert. Till den kan du lägga allt som skall skickas. Sedan med hjälp av en timer så skickar du detta data med önskat intervall.
Nackdelen är att du förmodligen kommer att få kö i sändarbufferten.
Nåja glad att kunna hjälpa till.
/peterhSv: Buffert & Winsock
Sv: Buffert & Winsock
MVH Gabriel Medina