[VB6]Winsock OCX te sloom ofzo?

Pagina: 1
Acties:

  • Glashelder
  • Registratie: September 2002
  • Niet online

Glashelder

Anti Android

Topicstarter
Allereerst m'n excuses dat ik nu 2 topics heb lopen hier over VB6, maar dit snap gaat dus m'n pet echt te boven. Ik ben dus bezig met een chatprogramma, en als er iemand iets zegt moet dit dus verzonden worden naar alle clients:
code:
1
2
3
4
5
6
7
    If Not (text = "") Then
        For I = 1 To NumCN - 1
            If Not Winsock1(I).State = 0 Then
                Winsock1(I).SendData "MSG:" & text
            End If
        Next I
    End If


NumCN houd bij hoeveel Winsock controls er geladen zijn. Het probleem is dat de tekst alleen verzonden wordt naar de client die het laatst aangemeld is. Vreemd genoeg gaat het wel goed met deze code:
code:
1
2
3
4
5
6
7
8
    If Not (text = "") Then
        For I = 1 To NumCN - 1
            If Not Winsock1(I).State = 0 Then
                Winsock1(I).SendData "MSG:" & text
                MsgBox "MSG Send to: " & text
            End If
        Next I
    End If

Alleen nu krijg ik voordat de tekst verzonden wordt bij elke client een message box 8)7 Hoe kan dit?

PV 4915wp op oost, 2680 wp op west, 1900 wp op zuid. pvoutput - AUX 8 kW bi bloc


  • mindcrash
  • Registratie: April 2002
  • Laatst online: 22-11-2019

mindcrash

Rebellious Monkey

Uhm, weet je 100% zeker dat dit algoritme juist is? Al eens op andere VB6 sites gezocht naar iets soortgelijks? Het lijkt er namelijk op dat je Winsock namelijk niet genoeg tijd geeft om z'n werk goed te doen... Zo kan ik me herinneren dat winsocket code in andere talen behoorlijk leunt op callback functies die hij zelf aanroept als hij een pakket data heeft verzonden e.d. ...

[ Voor 66% gewijzigd door mindcrash op 08-10-2004 16:15 ]

"The people who are crazy enough to think they could change the world, are the ones who do." -- Steve Jobs (1955-2011) , Aaron Swartz (1986-2013)


Verwijderd

Als je iets naar de winsock control stuurt gaat winsock het versturen, maar je vb code loopt gewoon door, dus krijg je automatisch de msgbox te zien, je moet een event van winsock afvangen welke afgaat als de data verzonden is en daarin je msgbox plaatsen

  • Glashelder
  • Registratie: September 2002
  • Niet online

Glashelder

Anti Android

Topicstarter
Ik wil juist geen msgbox, die moet eruit. Maar het werkt niet naar behoren zonder die messagebox.
mindcrash schreef op 08 oktober 2004 @ 16:11:
Uhm, weet je 100% zeker dat dit algoritme juist is? Al eens op andere VB6 sites gezocht naar iets soortgelijks? Het lijkt er namelijk op dat je Winsock namelijk niet genoeg tijd geeft om z'n werk goed te doen... Zo kan ik me herinneren dat winsocket code in andere talen behoorlijk leunt op callback functies die hij zelf aanroept als hij een pakket data heeft verzonden e.d. ...
Dat weet ik juist niet zeker. Zeker weten over die tijd? Het zijn een aantal winsock controls die aangesproken worden, ze staan in een control array. Geld die tijd dan ook?

PV 4915wp op oost, 2680 wp op west, 1900 wp op zuid. pvoutput - AUX 8 kW bi bloc


  • Kuhlie
  • Registratie: December 2002
  • Niet online
Gebruik op de plek van je MsgBox:
Visual Basic:
1
DoEvents

[ Voor 17% gewijzigd door Kuhlie op 08-10-2004 19:02 . Reden: in code-veld gezet ]


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 21-05 16:18
Ik zou maar es kijken of niet alle winsock aan de server kant met dezelfde client verbonden zijn ofzo.

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.


Verwijderd

DoEvents zou weinig moeten uitmaken, de winsock control is zelf threaded en zou dus prima de gegevens moeten afhandelen.

Voor de rest kan je m.b.v. de events kijken of die nog aan het sturen is of dat het versturen al compleet is. Ook is de state handig om in de gaten te houden.

Heb je ook al eens naar de *socket API's gekeken? Als je ten minste zo ver in VB zit dat je die begrijpt.

  • Kuhlie
  • Registratie: December 2002
  • Niet online
Glashelder schreef op 08 oktober 2004 @ 16:04:
Het probleem is dat de tekst alleen verzonden wordt naar de client die het laatst aangemeld is.
Ah, ik had niet goed gelezen. (Hoewel mijn oplossing wel werkt... DoEvents is helaas maar al te vaak een werkende quick-fix.)

Ik heb dit probleem al eens eerder met iemand anders besproken, we zijn er toen niet uitgekomen. Misschien helpt het:

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
'In Declarations:
Private Declare Function setsockopt Lib "wsock32.dll" _
              (ByVal s As Long, ByVal Level As Long, _
               ByVal optname As Long, _
              optval As Any, ByVal optlen As Long) As Long
Private Const IPPROTO_TCP As Long = 6
Private Const TCP_NODELAY As Long = 1

'Voor elke winsock-control in je controlarray, bijvoorbeeld op het 
'moment dat ze net geladen zijn:
Dim Value As Long
Value = 1
setsockopt ircSocket.SocketHandle, IPPROTO_TCP, TCP_NODELAY, _
                                   Value, LenB(Value)


dat hebben we toen niet geprobeerd. Wat dit doet is het Nagle-deel van het TCP/IP-protocol uitschakelen. Nagle wacht een bepaalde tijd voor het data verzendt, zodat hij bijvoorbeeld nog dingen met elkaar kan samenvoegen (piggy-back, of gewoon meer data). Als je het uitschakelt reageert Winsock wat sneller, misschien is dat hier ook gewoon een werkende fix.

Overigens meen ik me te herinneren dat het niet zo is dat er niks wordt verzonden, maar dat het gewoon erg lang duurt voordat het verzonden wordt, bijv. tot de volgende keer dat er wat verzonden wordt.

Ik noem het een bug ;)

[ Voor 4% gewijzigd door Kuhlie op 08-10-2004 22:33 . Reden: code opgemaakt zodat de breedte van dit topic niet stukgaat ]


  • Sponge
  • Registratie: Januari 2002
  • Laatst online: 23:37

Sponge

Serious Game Developer

Winsock1(I).SendData "MSG:" & text & vbCrLf
DoEvents

Dat moet het oplossen. ( in theorie)

Het is overigens inderdaad het hierboven 'probleem'. TCP gaat om streams, en niet over losse pakketjes zoals UDP.

Verwijderd

ik zou er of doevents of sleep(100)ms in hangen, vb6 is een tijd geleden.. gelukkig weet ik nu ook weer waarom:

vb: If Not (text = "") Then

c#: if (text!="") {

  • Glashelder
  • Registratie: September 2002
  • Niet online

Glashelder

Anti Android

Topicstarter
DoEvents lost inderdaad het probleem op. Ik heb echter je andere oplossing geprobeerd maar het werkt niet. Hoewel ik de kans dat ik het gewoon fout doe hoger inschat ;) :+
Verwijderd schreef op 08 oktober 2004 @ 22:46:
ik zou er of doevents of sleep(100)ms in hangen, vb6 is een tijd geleden.. gelukkig weet ik nu ook weer waarom:

vb: If Not (text = "") Then

c#: if (text!="") {
VB is inderdaad beetje vies. De C# / C++ / PHP stijl is beter vind ik ook.

Iedereen bedankt voor de hulp :)

PV 4915wp op oost, 2680 wp op west, 1900 wp op zuid. pvoutput - AUX 8 kW bi bloc


Verwijderd

prima, vergeet je niet "TAGS:" te gebruiken.. ahh zie dat je dat al doet

zo kan je ook van die stomme k*t iconen erin rammen, of sound: .. zal niet zoveel werk zijn allemaal.. half uurtje + 2 bakken koffie

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 21-05 16:18
Verwijderd schreef op 08 oktober 2004 @ 22:46:
ik zou er of doevents of sleep(100)ms in hangen, vb6 is een tijd geleden.. gelukkig weet ik nu ook weer waarom:

vb: If Not (text = "") Then

c#: if (text!="") {
Volgens mij is VB voor jouw idd lang geleden. De constructie slaat nergens op. Bovendien kent VB geen Sleep.

[ Voor 14% gewijzigd door farlane op 09-10-2004 00:21 ]

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.


  • ThunderNet
  • Registratie: Juni 2004
  • Laatst online: 21-05 15:09

ThunderNet

Flits!

@farlane
Sleep kan wel ;-) via de win32 api :P

Maarjah: voor de TS als je echt efficientie wilt gebruik een C++ versie van de winsock implementatie er zijn een paar "tweakers" die een iets aangepast link.exe gemaakt hebben dat je dus vb code in combinatie met c++ code kunt compileren (is grotendeels namelijk het zelfde) (Lang leve Microsoft Visual Studio :D :D ze hebben nagedacht!!!!)

En gebruik eerst dus een VB implementatie van de Winsock (code base, dus niet via de control) en daarna compileren met C++ versie ervan..... Dan heb je het echt snel! (Maar of zo'n snelheid ook nut heeft bij chat programma, denk ik niet)

Heb je liever vooraf, of achteraf, dat ik zeg dat ik geen flauw idee heb wat ik doe?


  • pjonk
  • Registratie: November 2000
  • Laatst online: 29-12-2025
Je kan ook eens een kijkje nemen op http://www.winsockvb.com
Daar staan een aantal leuke tutors en code voorbeelden hoe je via de Winsock API met sockets kan werken. Heb je net even wat meer controle en is ook handig als je Winsock wilt gebruiken in een applicatie zonder forms. ;)

It’s nice to be important but it’s more important to be nice


  • Kuhlie
  • Registratie: December 2002
  • Niet online
Ohja! Ik bedacht me net dat ik er zelf helemaal nooit meer last van heb, terwijl ik toch aan de lopende band projecten met Winsock maak. Een goede eigenschap van bugs is namelijk dat ze vaak na verloop van tijd gefixt worden ;)

Ofwel: je hebt vast nog niet Service Pack 5 (of tegenwoordig al 6) van Visual Studio 6 geinstalleerd. Dus, download en installeer:

Google: "Visual Basic 6 Service Pack 6"

en je bent van de bug verlost. DoEvents kan dan weg...

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 21-05 16:18
Kuhlie schreef op 09 oktober 2004 @ 11:12:
Google: "Visual Basic 6 Service Pack 6"

en je bent van de bug verlost. DoEvents kan dan weg...
Zit je alleen nog met die memory leak bug ;)

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.


  • Kuhlie
  • Registratie: December 2002
  • Niet online
farlane schreef op 10 oktober 2004 @ 11:21:
[...]


Zit je alleen nog met die memory leak bug ;)
offtopic:
welke, als ik vragen mag?

  • Sponge
  • Registratie: Januari 2002
  • Laatst online: 23:37

Sponge

Serious Game Developer

Overigens, totaal vergeten:

op www.pscode.com staan een aantal Winsock API wrappers, met 99% dezelfde interface als winsock. Het is een usercontrol, dus hoef je ook geen grote OCX te gebruiken.

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 21-05 16:18
Kuhlie schreef op 10 oktober 2004 @ 11:32:
[...]
offtopic:
welke, als ik vragen mag?
Als je winsock objecten Unload ( bij een disconnect bijvoorbeeld ) lekt er geheugen. Als je dat maar te vaak doet dan is het een keer einde verhaal.

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.


Verwijderd

Verwijderd schreef op 08 oktober 2004 @ 22:46:
ik zou er of doevents of sleep(100)ms in hangen, vb6 is een tijd geleden.. gelukkig weet ik nu ook weer waarom:

vb: If Not (text = "") Then

c#: if (text!="") {
If Text <> "" Then


Trouwens:

Python:
1
if text:


;)

  • Sponge
  • Registratie: Januari 2002
  • Laatst online: 23:37

Sponge

Serious Game Developer

Verwijderd schreef op 10 oktober 2004 @ 22:30:
[...]


If Text <> "" Then


Trouwens:

Python:
1
if text:


;)
Ik denk dat Len(String) > 0 de voorkeur heeft. :)

Verwijderd

Sponge schreef op 11 oktober 2004 @ 09:54:
[...]


Ik denk dat Len(String) > 0 de voorkeur heeft. :)
Waarom? Dat is toch meer typwerk, en ik kan geen uitzonderingsgeval bedenken waarin het éne wel werkt maar het andere niet. Verder vind ik het ook niet duidelijker.

  • Ashtaroth
  • Registratie: December 2003
  • Laatst online: 16-02 09:59
Verwijderd schreef op 11 oktober 2004 @ 11:47:
[...]


Waarom? Dat is toch meer typwerk, en ik kan geen uitzonderingsgeval bedenken waarin het éne wel werkt maar het andere niet. Verder vind ik het ook niet duidelijker.
Dat zijn idd overtuigende argumenten. Meer typewerk kan in dit geval toch geen reden zijn om iets wel of niet gebruiken.

Vlgs. mij heeft Len de voorkeur boven <> "", omdat het eerste simpel weg sneller is, correct me if I'm wrong.

  • Battle Bunny
  • Registratie: Oktober 2001
  • Laatst online: 02-02 21:41
Maarjah: voor de TS als je echt efficientie wilt gebruik een C++ versie van de winsock implementatie er zijn een paar "tweakers" die een iets aangepast link.exe gemaakt hebben dat je dus vb code in combinatie met c++ code kunt compileren (is grotendeels namelijk het zelfde) (Lang leve Microsoft Visual Studio :D :D ze hebben nagedacht!!!!)
Sorry voor de kick, maar heb je hier een URL van?

  • ThunderNet
  • Registratie: Juni 2004
  • Laatst online: 21-05 15:09

ThunderNet

Flits!

Ik heb even gezocht en kon het weer vinden :D
Ik heb het zelf nog nooit gebruikt, maar kwam het een poosje geleden tegen en dacht zelf zo van :*) dat is leuk, maar daar bleef het bij.

http://www.vbaccelerator....es/Link_Spoof/article.asp

Hier is de link

Heb je liever vooraf, of achteraf, dat ik zeg dat ik geen flauw idee heb wat ik doe?

Pagina: 1