[Vb6] Winsock Datastacking?

Pagina: 1
Acties:

  • Scyth
  • Registratie: Juli 2001
  • Laatst online: 16-03-2024

Scyth

Fat finger, three beer

Topicstarter
Okee, ff kort uitgelegd:

Client<->Server ChatProg

In een bepaalde situatie moet de server snel achter elkaar data versturen, zie volgende loop:
code:
1
2
3
For a=1 To UserCount
    wsUsers.SendData wsUsers(a).Tag
Next

Het probleem is, dat de server er nu een brij van maakt, in plaats van netjes alles apart afleveren.
Nu zag ik dat Winsock een boel .State's heeft:

0 - sckClosed
1 - sckOpen
2 - sckListening
3 - sckConnectionPending
4 - sckResolvingHost
5 - sckHostResolved
6 - sckConnecting
7 - sckConnected
8 - sckClosing
9 - sckError

Welke kan ik gebruiken als ik wil querien of de winsockpoort weer open is (dwz. klaar met versturen?)

Dell Studio XPS 16
Project: BavBierSub 1.0 BavBierSub 2.0


Verwijderd

Die?
code:
1
2
3
4
5
6
7
Private Sub Winsock1_SendComplete(Index As Integer)

End Sub

Private Sub Winsock1_SendProgress(Index As Integer, ByVal bytesSent As Long, ByVal bytesRemaining As Long)

End Sub

Dit snap ik alleen niet:
+(?)
|
wsUsers.SendData wsUsers(a).Tag

  • iENO
  • Registratie: November 2001
  • Niet online

iENO

pep

Kun je hier niet gewoon werken met Winsock(Index) ipv met een zelf aangemaakte UserCount?

  • Sponge
  • Registratie: Januari 2002
  • Laatst online: 15-08 11:47

Sponge

Serious Game Developer

code:
1
2
3
4
5
6
For A =1 To UserCount
    if wsUsers.State = sckClosed Then
     wsUsers.SendData wsUsers(A).Tag
     DoEvents
    End If
Next A

Denk dat dit wel ongeveer is wat je wilt dan...
Oh ja Tag = ehm..niet echt goed =-). MAar bij de Winsock control ishet nog wel redelijk te begrijpen, maar bijna bij elk ander control is het af te raden..

Verwijderd

code:
1
  wsUsers.SendData wsUsers(a).Tag

Krijg je hier geen foutmelding op? Is wsUsers nu wel of niet een array??
code:
1
2
if wsUsers.State = sckClosed Then
  wsUsers.SendData wsUsers(A).Tag

Ik denk dat je sckConnected bedoelt.... (wilde gok hoor >:))

Verwijderd

Žk heb ook een Client/Server chatprog geschreven...
werkt overigens buitengewoon goed.

Je moet een database maken waar je bij houdt :
Nickname
Password
Winsockindex
IPnr
Portnr

Tenminste,.. zo had ik het toen gedaan.
Je maakt van een winsock een array, en bij iedere "connection request" load je een nieuwe winsock, en je schroeft het portnummer 1tje omhoog.
En zodra je een senddata doet, kun je makkelijk alles uit de database trekken zodat je geen errors krijgt met "Array out of range" en dergelijken, natuurlijk moet je wel iedereen die "disconnect" uit de database gooien.

Want als je het op jou manier doet... en je hebt een array van 10 users(oftewel 10 winsocks) en nummer 5 disconnect...
dan krijg je een "Wrong protocol or request at current state bla bla bla " bij je fornext loopje die de data send... en tuurlijk kan je er een "On Error Resume Next" in zetten maar dan weet je ook niet of er zich andere errors voordoen.

Ik heb die source nog wel ergens van mijne, maar zit nu niet thuis... maar ben best bereid om die te sturen als je intresse heb.
Met kick/ban functie, private messages enz.

zeg het maar

Verwijderd

Dan ff antw op je vraag : de connectie blijft geopend, ookal is tie klaar met zenden

in de winsock zit een, ja hoe noem je dat, ... net als FORM_LOAD heb je bij winsock een Winsock1_SendComplete of iets dergelijks

  • DigiK-oz
  • Registratie: December 2001
  • Laatst online: 17:42
Je kan het in ieder geval voorkomen door, als je socket open is, de functie SetSockOpt te gebruiken met de parameter TCP_NODELAY. Dan wordt data direct verstuurd, zonder dat er gewacht wordt voor een korte tijd op eventueel meer data voor dezelfde socket.

Dit delay zit er in om te voorkomen dat er veel overhead in je communicatie zit (tcp-headers voor 1 byte data is wel een beetje veel overhead). Maar in het geval van een lokaal netwerkje zul je er geen last van hebben als je het dus uitzet.

Whatever


Verwijderd

IDD
of een
DoEvents

  • DigiK-oz
  • Registratie: December 2001
  • Laatst online: 17:42
Kan wel, maar wie geeft de garantie dat DoEvents lang genoeg vertraagd om de delay te laten verstrijken ?

Met een beetje pech krijg je dan de situatie dat het soms wel, soms niet werkt, dat zijn pas echt leuke problemen :)

Whatever


Verwijderd

ok ok, you win :7

Verwijderd

Dan hoef je nog alleen maar rekening te houden met een eventuele recieve-buffer aan de kant van de client ;)

Sorry voor de late reactie, maar ik denk dat ik nu pas begrijp wat het probleem is... De server moet een aantal commando's achter elkaar versturen naar een client, maar op de client komen ze niet 1 voor 1 binnen (aparte DataArrival-events). Is de oplossing (indien bovenstaande klopt) om elk commando af te sluiten met een bepaalde code/scheidingsteken :?

Verwijderd

^^^^^^^^^^^^^^

Hiervoor moet je dus achter de SENDDATA : DOEVENTS zetten
dan heb je geen last van op1gehoopte data, misschien bij binnekomst op de client wel, maar dan moet je dus gewoon een CHR$(10) + 13 meegeven, en afvangen op client

  • DigiK-oz
  • Registratie: December 2001
  • Laatst online: 17:42
Op woensdag 03 juli 2002 11:59 schreef Debbus het volgende:
Dan hoef je nog alleen maar rekening te houden met een eventuele recieve-buffer aan de kant van de client ;)

Sorry voor de late reactie, maar ik denk dat ik nu pas begrijp wat het probleem is... De server moet een aantal commando's achter elkaar versturen naar een client, maar op de client komen ze niet 1 voor 1 binnen (aparte DataArrival-events). Is de oplossing (indien bovenstaande klopt) om elk commando af te sluiten met een bepaalde code/scheidingsteken :?
Scheidingsteken gebruiken kan altijd, en daarop checken. Maar het feit dat de data aan elkaar geplakt zit, ligt niet aan de client, maar aan de TCP/IP stack van de server. Om efficiency-redenen wordt data die erg kort na elkaar verstuurd moet worden, in de TCP/IP stack gedetecteerd en aan elkaar geplakt. En daarvoor is dus die TCP_NODELAY functie, die voorkomt dat.

Kwestie van kiezen dus : Extra code om scheidingstekens te filteren bij receive, of extra code om bij send ervoor te zorgen dat alles apart wordt verstuurd....

Whatever


  • Scyth
  • Registratie: Juli 2001
  • Laatst online: 16-03-2024

Scyth

Fat finger, three beer

Topicstarter
Sorry dak zolang niet antwoorde, maar was ff AFK... Duss. Lots of replies, maar ik denk dak aan...
Op woensdag 03 juli 2002 01:37 schreef 00fly747 het volgende:
Die?
code:
1
2
3
4
5
6
7
Private Sub Winsock1_SendComplete(Index As Integer)

End Sub

Private Sub Winsock1_SendProgress(Index As Integer, ByVal bytesSent As Long, ByVal bytesRemaining As Long)

End Sub

Dit snap ik alleen niet:
[..]
... het meeste heb; ik wist nie dat er een SendComplete was :o

Ik gebruik dus de tag van de winsock voor storage van de username (Winsock is dus een array, er zat een foutje imme eerste post). wsUsers(a).Tag is dus de NickName van de user geconnect op mijn a-de wsUsers().

Methode werkt, maar is niet perfect...

Maar EggsTC, je mag de source opsturen, e-mail staat imme "Bekijk het profiel van scyth" :)

Dell Studio XPS 16
Project: BavBierSub 1.0 BavBierSub 2.0


  • Sponge
  • Registratie: Januari 2002
  • Laatst online: 15-08 11:47

Sponge

Serious Game Developer

Op woensdag 03 juli 2002 08:52 schreef Debbus het volgende:
code:
1
  wsUsers.SendData wsUsers(a).Tag

Krijg je hier geen foutmelding op? Is wsUsers nu wel of niet een array??
code:
1
2
if wsUsers.State = sckClosed Then
  wsUsers.SendData wsUsers(A).Tag

Ik denk dat je sckConnected bedoelt.... (wilde gok hoor >:))
Hmm, half :)

Als de socket gesloten is moet ie opnieuw verbonden... maar had de post ook half gelezen :)

Verwijderd

sjis schreef op 03 July 2002 @ 10:27:
Je kan het in ieder geval voorkomen door, als je socket open is, de functie SetSockOpt te gebruiken met de parameter TCP_NODELAY. Dan wordt data direct verstuurd, zonder dat er gewacht wordt voor een korte tijd op eventueel meer data voor dezelfde socket.

Dit delay zit er in om te voorkomen dat er veel overhead in je communicatie zit (tcp-headers voor 1 byte data is wel een beetje veel overhead). Maar in het geval van een lokaal netwerkje zul je er geen last van hebben als je het dus uitzet.
Ik heb hetzelfde probleem, hoe moet dat nu precies wta je hierboven bedoeld? Example plz...

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 22:38
Overigens is het SendComplete event geen garantie dat de socket niet zal blocken bij snel een tweede bericht sturen.

zie sckWouldBlock

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • Sponge
  • Registratie: Januari 2002
  • Laatst online: 15-08 11:47

Sponge

Serious Game Developer

http://www.vbip.com is misschien een goede bron voor winsock API e.d.

Hmm, ik zal een beetje meer toevoegen ;)

DoEvents zorgt er meestal voor dat data goed aankomt, met Winsock weet je het echter nooit zeker, als je TCP gebruikt: TCP is gebaseerd op een "stream"

UDP is mogelijke oplossing, maar daar moet je zelf packetloss en sequentiele pakketjes afhandelen...

[ Voor 73% gewijzigd door Sponge op 20-02-2003 23:13 ]

Pagina: 1