Avatar billede martinfrost Nybegynder
15. oktober 2001 - 11:06 Der 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 :)


/ Martin
Avatar billede jper Nybegynder
15. oktober 2001 - 16:16 #1
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.
Avatar billede martinfrost Nybegynder
15. oktober 2001 - 19:10 #2
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.

/ Martin
Avatar billede jper Nybegynder
16. oktober 2001 - 11:30 #3
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 <<
Avatar billede martinfrost Nybegynder
16. oktober 2001 - 11:48 #4
Yup, men jeg tror vi snakker lidt forbi hinanden, for det princip jeg leder efter er ikke helt det du skriver.
Avatar billede martinfrost Nybegynder
14. november 2001 - 12:37 #5
Desværre ingen point...
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester

IT-JOB