15. oktober 2001 - 11:06Der er
4 kommentarer og 1 løsning
Winsock Problem
Jeg har et problem med en klient til en lille chat, vi er ved at lave. Hvis folk skriver på NØJAGTIG samme tid, så fucker det en smule op. Problemet opstår mens den modtagede streng behandles. Hvis der imens strengen behandles modtages nye data fra winsock\'en, fuldføres behandlingen af forrige streng ikke.
Den streng der modtages indeholder oplysninger om teksten formatering, og det er denne formatering som teksten simpelthen ikke får, hvis proceduren afbrydes pga. nye data fra winsock\'en.
Jeg vil utrolig gerne undgå at dette problem kan opstå. Jeg har snakket med nogle kloge mennesker, som mener, jeg skal bruge såkaldte semaphores - men jeg har ingen ide om hvordan, de skal bruges :-/
For lige at sætte det hele lidt mere sammen har jeg lige skrevet lidt af koden op:
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Winsock1.GetData strData, vbString
strData splittes herefter op og behandles, så selve strengteksten får den rette formatering osv.
End sub
Det er princippet i proceduren. Og problmet opstår som sagt, når proceduren ikke fuldføres pga. nye data fra winsock\'en. Jeg prøvede selv at lege lidt med nogle
private... dim busy as boolean
if busy = true then (vent lidt) else (modtag streng) end if
busy = true
DATA BEHANDLING...
busy = false end sub
Men dette princip virkede heller ik... Så jeg håber nogen kan hjælpe :)
Desværre kan Winsock kontrollen kun behandle en connection ad gangen, jeg kiggede lidt i MSDN\'en og fandt det her kode. Du skal lave et kontrol array så kan man lave en ny winsock kontrol pr. connection, og derved få proceduren fuldført.
Private intMax As Long
Private Sub Form_Load() intMax = 0 sckServer(0).LocalPort = 1001 sckServer(0).Listen End Sub
Private Sub sckServer_ConnectionRequest _ (Index As Integer, ByVal requestID As Long) If Index = 0 Then intMax = intMax + 1 Load sckServer(intMax) sckServer(intMax).LocalPort = 0 sckServer(intMax).Accept requestID Load txtData(intMax) End If End Sub
MS egen beskrivelse: The basic server outlined above accepts only one connection request. However, it is possible to accept several connection requests using the same control by creating a control array. In that case, you do not need to close the connection, but simply create a new instance of the control (by setting its Index property), and invoking the Accept method on the new instance.
The code below assumes there is a Winsock control on a form named sckServer, and that its Index property has been set to 0; thus the control is part of a control array. In the Declarations section, a module-level variable intMax is declared. In the form\'s Load event, intMax is set to 0, and the LocalPort property for the first control in the array is set to 1001. Then the Listen method is invoked on the control, making it the \"listening control. As each connection request arrives, the code tests to see if the Index is 0 (the value of the \"listening\" control). If so, the listening control increments intMax, and uses that number to create a new control instance. The new control instance is then used to accept the connection request.
Men det er jo heller ikke flere connections som sådan?! Alle data kommer jo fra samme server.
Problemet opstår kun når to data kommer indenfor samme tiendedel-sekund ca.
Princippet jeg søger, er at winsock data sættes i kø, hvis databehandlingen i proceduren ikke er fuldført. Når behandlinger er fuldført tages næste data i køen og behandles.
Som MS skriver kan du bruge den samme connection ved at gøre som jeg har foreslået. Jeg citere: >> it is possible to accept several connection requests using the same control by creating a control array. In that case, you do not need to close the connection <<
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.