VB6 WinSock Probleem

Pagina: 1
Acties:

  • GAEvakYD
  • Registratie: Juni 2001
  • Laatst online: 21:28
Ik ben bezig met een applicatie in VB6. Het gaat allemaal goed totdat ik
een label printer (Avert 64-05) moest gaan aansturen via winsock.

Het eerste wat ik gedaan heb is een klein testprogramma gemaakt die via winsock
wat data verstuurt (de string met daarin het label formaat). Tevens ook een string
die aangeeft dat de printer zijn status moet retourneren. Deze bevat dan bijvoorbeeld
een nummer dat overeenkomt met een bepaalde error.

Ik had een losse connect knop met deze simpele code erin
code:
1
2
3
4
5
6
7
    With Winsock1
        If .State <> sckClosed Then .Close
        .Connect
        If .State = sckClosed Then
            MsgBox "Niet gelukt om verbinding te maken"
        End If
    End With


Vervolgens had ik twee lossen knoppen om een barcode te printen of om de status op te vragen
code:
1
Winsock1.SendData "#!A1#!X0"


Dit functioneerde perfect en alle data kwam netjes binnen.

Nu wilde ik dat bij het drukken op de knop hij zelf ging kijken of hij al verbonden was. Dat
ik dus niet meer zelf los op de connect knop moest drukken. Eerst had ik de code van de connect knop even tijdelijk boven de andere bestaande code van de knoppen gezet. Helaas kreeg ik hier een hele nare foutmelding
code:
1
runtime error '40006': wrong protocol connection state for the requested transaction or request



Ik ben toen gaan zoeken op internet en kwam heel veel resultaten tegen, behalve DE oplossing. Op sommigen plekken uit 2003 las ik iets over een fout in het winsock component. Ik heb nergens hier echt een duidelijk antwoord over gelezen. Ik heb overigens het laatste servicepack van Visual Studio, namelijk 6. Hierin zit ook een aangepaste versie van het winsock component. Ik ga er dus vanuit dat als er in 2003 een fout gevonden was dat die wel meegenomen zou zijn in het servicepack dat nu een paar maanden oud is. Ik heb later nog een keer een andere mswinsck.ocx gedownload en die geprobeerd maar dat mocht niets helpen.

Ondertussen ben ik na 2 dagen prutsen niets verder gekomen. Behalve dat het testprogramma nu hemaal niets meer wilt doen. Ook niet als ik een losse connect en opdracht geef. Ik krijg nu altijd die nare 40006 error.

Heeft iemand een idee, ik weet echt niet meer hoe dit op te lossen. Als ik meer data moet geven, geef het dan even aan.

Btw printen via de Printer.print manier is geen optie. De applicatie moet supersnel barcodes gaan printen en die windows spooler vertraagt al een afdrukt minimaal 1 seconden.

  • GAEvakYD
  • Registratie: Juni 2001
  • Laatst online: 21:28
De complete code, brand me niet af op schoonheid. Het is maar een testproggie voor een uiteindelijke module van het echte programma

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
Option Explicit

Private Declare Sub Sleep Lib "Kernel32" (ByVal dwMilliseconds As Long)

Private Type printerstatus
    laatste_status_nummer       As Long
    status_is_nog_niet_gevraagd As Boolean 'Als de status nog niet eerder opgevraagt is
    status_displayed_niet_ack   As Boolean 'As de status word weergegevn op het display maar niet bevestigd is
    labelstatus                 As Integer '0=Geen valid opgeslagen,1=Wel geopend maar niet afgesloten, 2=Valid format
    printqueue                  As Long 'Hoeveel labels er nog geprint moeten worden
    bytes_free                  As Long 'Hoeveel bytes er nog vrij zijn in de spooler
    firmware_versie             As String 'Firmware versie
End Type

Const PRINTER_STATUS_ANDERE = "Andere ongedefineerde status error"
Const PRINTER_STATUS_0 = "Geen fouten"
Const PRINTER_STATUS_1090 = "Printopdracht niet compleet"
Const PRINTER_STATUS_1170 = "X positie overschrijft maximum"
Const PRINTER_STATUS_1171 = "X positie kleiner dan nul"
Const PRINTER_STATUS_1172 = "Y positie overschrijft label lengte"
Const PRINTER_STATUS_1173 = "Y positie kleiner dan nul"
Const PRINTER_STATUS_1395 = "Label te breed"
Const PRINTER_STATUS_1396 = "Label te lang"
Const PRINTER_STATUS_5001 = "Geen label tussenruimte gevonden"
Const PRINTER_STATUS_5002 = "Stickermateriaal op"
Const PRINTER_STATUS_5003 = "Printercover staat open"
Const PRINTER_STATUS_5008 = "Afdrukfolie op"
Const PRINTER_STATUS_5064 = "Opwind rol is vol"
Const PRINTER_STATUS_5500 = "Onbekende software error"
Const PRINTER_STATUS_5501 = "Onbekende software error"
Const PRINTER_STATUS_8305 = "Fout tijdens printen van barcode"

Private clsStatus As printerstatus

Private Sub maakVerbinding()
    With Winsock1
        If .State <> sckClosed Then .Close
        .Connect
        If .State = sckClosed Then
            MsgBox "Niet gelukt om verbinding te maken"
        End If
    End With
End Sub

Private Sub cmdConnect_Click()
    maakVerbinding
End Sub

Private Sub cmdLeesStatus_Click()
    Winsock1.SendData "#!A1#!X0"
End Sub

Private Sub cmdPrint_Click()
    Winsock1.SendData "#!A1#DC#IMS90/12//0#PO0#N9#ERN0///0.00#T009.5#J002.4#YB019/0MP2.5/003/8///123456#G#Q1#G#!P1"
End Sub

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
    Dim strData As String
    
    Winsock1.GetData strData, vbString
    clsStatus = ontrafelPrinterStatus(strData)
    printPrinterStatus
End Sub

Private Function printPrinterStatus()
    txtstatus = convertStatusToText(clsStatus.laatste_status_nummer)
    txtprinterqueue = CStr(clsStatus.printqueue)
    txtbytesfree = CStr(clsStatus.bytes_free)
End Function

Private Function convertStatusToText(Gelezen As Long) As String
    Select Case Gelezen   ' Evaluate Number.
    Case 0
        convertStatusToText = PRINTER_STATUS_0
    Case 1090
        convertStatusToText = PRINTER_STATUS_1090
    Case 1170
        convertStatusToText = PRINTER_STATUS_1170
    Case 1171
        convertStatusToText = PRINTER_STATUS_1171
    Case 1172
        convertStatusToText = PRINTER_STATUS_1172
    Case 1173
        convertStatusToText = PRINTER_STATUS_1173
    Case 1395
        convertStatusToText = PRINTER_STATUS_1395
    Case 1396
        convertStatusToText = PRINTER_STATUS_1396
    Case 5001
        convertStatusToText = PRINTER_STATUS_5001
    Case 5002
        convertStatusToText = PRINTER_STATUS_5002
    Case 5003
        convertStatusToText = PRINTER_STATUS_5003
    Case 5008
        convertStatusToText = PRINTER_STATUS_5008
    Case 5064
        convertStatusToText = PRINTER_STATUS_5064
    Case 5500
        convertStatusToText = PRINTER_STATUS_5500
    Case 5501
        convertStatusToText = PRINTER_STATUS_5501
    Case 8305
        convertStatusToText = PRINTER_STATUS_8305
    Case Else   ' Andere error
        convertStatusToText = PRINTER_STATUS_ANDERE
    End Select
End Function

'formaat is altijd 40 karakters lang met de volgende opbouw
'SaaaaAbcdMqqqqqqFeeeeeeKxxxxxxxxxxxxxxxx
Private Function ontrafelPrinterStatus(statusstring As String) As printerstatus
Dim iTeller As Integer
Dim status As printerstatus
Dim tempstring As String

tempstring = statusstring

'--------------------------S gedeelte-----------------------
'Haal de S eraf
tempstring = Mid(tempstring, 2)
'Zet het resterende S stuk om naar een long
status.laatste_status_nummer = CLng(Left(tempstring, 4))
'Haal de vier status karakters van de string af eraf
tempstring = Mid(tempstring, 5)

'--------------------------A gedeelte-----------------------
'Haal de A eraf
tempstring = Mid(tempstring, 2)

'Zet het b karakter om
status.status_is_nog_niet_gevraagd = CBool(Left(tempstring, 1))
'Haal het b karakter eraf
tempstring = Mid(tempstring, 2)

'Zet het c karakter om
status.status_displayed_niet_ack = CBool(Left(tempstring, 1))
'Haal het c karakter eraf
tempstring = Mid(tempstring, 2)

'Zet het d karakter om
status.labelstatus = CInt(Left(tempstring, 1))
'Haal het d karakter eraf
tempstring = Mid(tempstring, 2)

'--------------------------M gedeelte-----------------------
'Haal de M eraf
tempstring = Mid(tempstring, 2)
'Zet het resterende S stuk om naar een long
status.printqueue = CLng(Left(tempstring, 6))
'Haal de zes status karakters van de string af eraf
tempstring = Mid(tempstring, 7)

'--------------------------F gedeelte-----------------------
'Haal de F eraf
tempstring = Mid(tempstring, 2)
'Zet het resterende F stuk om naar een long
status.bytes_free = CLng(Left(tempstring, 6))
'Haal de zes status karakters van de string af eraf
tempstring = Mid(tempstring, 7)

'--------------------------K gedeelte-----------------------
'Haal de K eraf
tempstring = Mid(tempstring, 2)
'Zet het resterende K stuk om naar een Signle
status.firmware_versie = Left(tempstring, 16)

ontrafelPrinterStatus = status

End Function

[ Voor 6% gewijzigd door GAEvakYD op 12-05-2005 16:23 ]


Verwijderd

die error betekent imo dat je iets probeert te doen terwijl hij nog in de verkeerde staat is (niet verbonden dus)

voordat je connect of iets anders gaat doen moet je eerst ff de connection closen:
Winsock1.Close

  • GAEvakYD
  • Registratie: Juni 2001
  • Laatst online: 21:28
Dat gebeurt toch juist hier
code:
1
2
If .State <> sckClosed Then .Close
        .Connect


Hij gooit dus altijd eerst zijn verbinding dicht. Daarna maakt hij een nieuwe verbinding middels connect

  • Brahiewahiewa
  • Registratie: Oktober 2001
  • Laatst online: 30-09-2022

Brahiewahiewa

boelkloedig

GAEvakYD schreef op donderdag 12 mei 2005 @ 16:32:
Dat gebeurt toch juist hier
code:
1
2
If .State <> sckClosed Then .Close
        .Connect


Hij gooit dus altijd eerst zijn verbinding dicht. Daarna maakt hij een nieuwe verbinding middels connect
Hmmz, 'k zie nergens in je code staan waar je sckClosed definieert. Nou is dat toevallig voor scKClosed geen issue, omdat die toch 0 is, maar slordig is 't wel.
Verders: heb je gesjekt welke versienummer jouw mswinsck.ocx heeft?
Groter dan 6.0.95.24 ?

QnJhaGlld2FoaWV3YQ==


  • Spider.007
  • Registratie: December 2000
  • Niet online

Spider.007

* Tetragrammaton

Lijkt me meer iets voor PW :)

SA > PW

---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate


  • GAEvakYD
  • Registratie: Juni 2001
  • Laatst online: 21:28
Brahiewahiewa schreef op donderdag 12 mei 2005 @ 17:55:
[...]

Hmmz, 'k zie nergens in je code staan waar je sckClosed definieert. Nou is dat toevallig voor scKClosed geen issue, omdat die toch 0 is, maar slordig is 't wel.
Verders: heb je gesjekt welke versienummer jouw mswinsck.ocx heeft?
Groter dan 6.0.95.24 ?
Is dat sckClosed niet gewoon een constante die in VB6 algemeen bekend is?. Als ik sck intype en dan cntrl+spatie dan zie ik ook alle andere statusen zoals sckOpen, sckConnection.

Ik heb versie 6.01.97.82. Dat is de versie die met SP6 van Visual Studio is gewijzigd. Dit is volgens mij de laatste versie van het mswinsck.ocx component.

[ Voor 36% gewijzigd door GAEvakYD op 13-05-2005 08:40 ]


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 07-05 10:04
GAEvakYD schreef op donderdag 12 mei 2005 @ 16:32:
Dat gebeurt toch juist hier
code:
1
2
If .State <> sckClosed Then .Close
        .Connect


Hij gooit dus altijd eerst zijn verbinding dicht. Daarna maakt hij een nieuwe verbinding middels connect
Je gaat er echter vanuit dat er alleen maar een status close en een status connected is. Er is ook nog zoiets als connecting en closing. Mn de status connecting kan lang duren ( min 30s, en die is niet instelbaar zonder de win32 api te gebruiken. *Dat moet je op de koop toe nemen als je VB gebruikt* :) ) als je apparaat geen sjoege geeft. ( Ik verwacht dan ook dat op een of andere manier je apparaat geen goede netwerk verbinding meer heeft ). Tijdens die status kun je vreemde toestanden verwachten.

Wat ik over het algemeen doe bij het winsock component is een polling timer starten die periodiek een bericht verstuurt naar de peer, en de status checkt van de verbinding. ( MIsschien kent je printer ook wel een status commando ). Het probleem is namenlijk dat je unclean disconnects ( de verbinding wordt niet netjes afgesloten ) pas detecteren kunt als je iets verstuurt. Je kunt bovendien pas berichten versturen als je idd geconnect bent.

Het wsock component heeft ook een aantal events ( error, disconnect etc ), maar die treden ook alleen op als alles volgens de juiste manier gaat. Vandaar dat je bijna niet onden een poll uitkomt bij dat ding.

Btw, Winsock componenten unloaden en loaden is een slecht idee. Er zit nm een memory leak in. Dus tenzij je app niet continu hoeft te draaien is dat niet de oplossing.
Gebruik ook eens af en toe netstat om te kijken hoe lang je sockets nog leven nadat jij hebt gezegd dat ze moesten closen. En verbaas je erover dat je ongelooflijk veel sockets onder water open blijft houden, tot een minuut nadat jij ze al had dichtgegooid.

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.


  • GAEvakYD
  • Registratie: Juni 2001
  • Laatst online: 21:28
farlane schreef op vrijdag 13 mei 2005 @ 10:15:
[...]


Je gaat er echter vanuit dat er alleen maar een status close en een status connected is. Er is ook nog zoiets als connecting en closing. Mn de status connecting kan lang duren ( min 30s, en die is niet instelbaar zonder de win32 api te gebruiken. *Dat moet je op de koop toe nemen als je VB gebruikt* :) ) als je apparaat geen sjoege geeft. ( Ik verwacht dan ook dat op een of andere manier je apparaat geen goede netwerk verbinding meer heeft ). Tijdens die status kun je vreemde toestanden verwachten.
Ik zou inderdaad de status Connection etc kunnen bijvoegen. Toch is het gek want de netwerkverbinding is perfect. Ik kan namelijk wel printen via de default windows spooler (printer.print, die print naar een standaard generic tcp-ip poort).
Wat ik over het algemeen doe bij het winsock component is een polling timer starten die periodiek een bericht verstuurt naar de peer, en de status checkt van de verbinding. ( MIsschien kent je printer ook wel een status commando ). Het probleem is namenlijk dat je unclean disconnects ( de verbinding wordt niet netjes afgesloten ) pas detecteren kunt als je iets verstuurt. Je kunt bovendien pas berichten versturen als je idd geconnect bent.
De printer kent inderdaad 9999 verschillende status berichten. Alleen moet ik daarvoor een string string die de printer kenbaar maakt een status te retouneren. Dit doe ik met die string:
code:
1
Winsock1.SendData "#!A1#!X0"

Helaas krijg ik die dus niet over op de lijn heen. Sinds ik aan het proberen ben geweest met die verschillende ocx'n doet winsock het helemaal niet meer naar de printer. Ook niet bij een lossen connect achter een button. :'( :'( :'(
Het wsock component heeft ook een aantal events ( error, disconnect etc ), maar die treden ook alleen op als alles volgens de juiste manier gaat. Vandaar dat je bijna niet onden een poll uitkomt bij dat ding.

Btw, Winsock componenten unloaden en loaden is een slecht idee. Er zit nm een memory leak in. Dus tenzij je app niet continu hoeft te draaien is dat niet de oplossing.
Gebruik ook eens af en toe netstat om te kijken hoe lang je sockets nog leven nadat jij hebt gezegd dat ze moesten closen. En verbaas je erover dat je ongelooflijk veel sockets onder water open blijft houden, tot een minuut nadat jij ze al had dichtgegooid.
Ow goed om te weten. Dit moet namelijk wel een 24/7 applicatie worden. Ik was er toch vanuit gegaan dat MS dit veel gebruikte component wel op orde zou hebben.

iemand een idee trouwens waarom die het nu helemaal niet meer doet?. Ik heb nu de zelfde versie weer van het component als voor ik begon. Ik blijf die leuke 40006 error houden.

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 07-05 10:04
Probeer eens een setup van je project te maken ( package en deplyment wizz) op een andere pc, en die te installeren op jouw pc.

Misschien dat de versies van je winsock dll's niet overeenkomen met de versie van je winsock ocx.

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.


  • GAEvakYD
  • Registratie: Juni 2001
  • Laatst online: 21:28
Ik heb zojuist het volgende gedaan:
-mswinsck.ocx verplaats
-regclean tool gedraait, die haald 15 verwijzingen naar het ocx weg
-ocx weer in de system32 map gezet
-regsvr32 c:\2\MSWINSCK.OCX gedraait
-Component opnieuw gepacked
-resultaat -> zelfde probleem

Dat bleek niet het probleem te zijn waarom die niets meer deed. Doordat ik een paar keer het proejct geopend had terwijl het component niet bestond waren alle properties gereset. Ik had namelijk daar fixed het ip adres en poort staan waar die op moest connecten. Dit heb ik goed gezet en nu werkt het weer.

MAAR nog steeds met de losse connect en actie manier. Dus als ik de functie om te connecten los aanroep achter een aparte knop gaat het goed. Als ik daarna schrijf en lees acties doe werkt het perfect. Doe ik de actie die achter de connect knop zit (de functie maakverbinding) bij de andere actie onder de knop zet dan gaat alles fout. Dan blijft hij op de status sckConnection staan.

[ Voor 73% gewijzigd door GAEvakYD op 13-05-2005 11:59 ]


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 07-05 10:04
Probeer je functie eens zo te schrijven dat hij een verbinding maakt en pas als de status naar sckConnected gaat dingen te versturen, bijvoorbeeld door de laatste twee acties in een timer routine te doen.

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.


  • jan-marten
  • Registratie: September 2000
  • Laatst online: 27-04 16:48
Naast de state sckClosed heb je er nog een aantal. Het is altijd leuk :)
Visual Basic:
1
2
3
4
5
6
7
8
While not WinSock1.State = sckClosed
   WinSock1.Close
Wend
WinSock1.Connect ipaddres, port
While Not WinSock1.State = sckConnected
   'wacht, wel wat ranzig maar ach
wend
WinSock1.senddata strData

Verder kun je de foutmelding ook krijgen als je iets probeert te versturen indien je nog niet verbonden bent (als je TCP gebruikt als protocol).

  • GAEvakYD
  • Registratie: Juni 2001
  • Laatst online: 21:28
Het probleem is opgelost, jipiiiiiii.

Het was eigelijk gewoon een stuk verkeerd programmeren van mij. Wat was het probleem:

In de connect functie deed ik de volgende actie:
code:
1
2
3
4
5
6
7
    With Winsock1
        If .State <> sckClosed Then .Close
        .Connect
        If .State = sckClosed Then
            MsgBox "Niet gelukt om verbinding te maken"
        End If
    End With


Ik vroeg dus na de connect gelijk de status op. Aangezien de call connect asynchroon verwerkt word retouneert hij gelijk en zal verder gaan met het volgende statement. Dat terwijl hij in een andere thread onder water in het winsock component nog aan het connecten was. Dan is de status natuurlijk altijd 'connection'

Ik moest dus iets doen met het connect event. Die gaat af als er echt verbinding gemaakt was en dat dat gelukt was.

  • GAEvakYD
  • Registratie: Juni 2001
  • Laatst online: 21:28
jan-marten schreef op vrijdag 13 mei 2005 @ 13:33:
Naast de state sckClosed heb je er nog een aantal. Het is altijd leuk :)
Visual Basic:
1
2
3
4
5
6
7
8
While not WinSock1.State = sckClosed
   WinSock1.Close
Wend
WinSock1.Connect ipaddres, port
While Not WinSock1.State = sckConnected
   'wacht, wel wat ranzig maar ach
wend
WinSock1.senddata strData

Verder kun je de foutmelding ook krijgen als je iets probeert te versturen indien je nog niet verbonden bent (als je TCP gebruikt als protocol).
idd ik heb het uiteindelijk precies zo opgelost.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Private printerConnected As Boolean

Private Sub maakVerbinding()
    With Winsock1
        If .State <> sckClosed Then .Close
        .RemoteHost = "192.168.3.161"
        .RemotePort = 9100
        .Connect
        While printerConnected <> True
            DoEvents
        Wend
    End With
End Sub

Private Sub Winsock1_Connect()
    printerConnected = True
End Sub


Bedankt allemaal voor de hulp.

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 07-05 10:04
Hum, zit ik net de hele tijd te verkondigen dat je een timer kunt gebruiken om de status op te vragen en pas wat versturen als de status connected is, ga je met DoEvents lopen pielen.

Jouw applicatie gaat dus ( als er op een of andere manier de printer niet kan worden benaderd ) minimaal 30s lang 100% cpu tijd lopen vreten.

[edit]
Sterker nog, jouw applicatie gaat gewoon helemaal niet meer reageren als zoiets gebeurt.

[ Voor 14% gewijzigd door farlane op 13-05-2005 17:52 ]

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.


  • GAEvakYD
  • Registratie: Juni 2001
  • Laatst online: 21:28
farlane schreef op vrijdag 13 mei 2005 @ 17:51:
Hum, zit ik net de hele tijd te verkondigen dat je een timer kunt gebruiken om de status op te vragen en pas wat versturen als de status connected is, ga je met DoEvents lopen pielen.

Jouw applicatie gaat dus ( als er op een of andere manier de printer niet kan worden benaderd ) minimaal 30s lang 100% cpu tijd lopen vreten.

[edit]
Sterker nog, jouw applicatie gaat gewoon helemaal niet meer reageren als zoiets gebeurt.
Het connected raken gebeurt hier sneller dan een seconde. Dit gebeurt dus eenmalig bij het opstarten van het programma. Dat leek mij beter dan alle tijd dat de applicatie draait een timer te laten meelopen om de paar miliseconden. Dat blijft die dan de hele tijd doen en aangezien het een 24/7 applicatie is leek me dat een mindere optie.

Misschien zie ik het helemaal verkeerd.

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 07-05 10:04
GAEvakYD schreef op vrijdag 13 mei 2005 @ 22:51:
[...]

Het connected raken gebeurt hier sneller dan een seconde. Dit gebeurt dus eenmalig bij het opstarten van het programma. Dat leek mij beter dan alle tijd dat de applicatie draait een timer te laten meelopen om de paar miliseconden. Dat blijft die dan de hele tijd doen en aangezien het een 24/7 applicatie is leek me dat een mindere optie.

Misschien zie ik het helemaal verkeerd.
Het probleem is dat als er iets mis is met de verbinding, je toch je socket moet sluiten en opnieuw connecten om hem weer goed te maken.
Het 'voelt' idd wat lomp om een timer te laten pollen, maar die timer hoeft niet elke milliseconde te runnen. Je gebruikt em alleen om de status van je verbinding te bewaken.

Zeker bij 24/7 apps moet je defensief programmeren en bij ieder stap afvragen 'wat kan er fout gaan?'. Als je met dit soort dingen bezig bent moet je je dus ook afvragen wat er met de andere kant van je comm. kanaal fout kan gaan.

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.

Pagina: 1