VB6 winsock-control: schließen einer Verbindung und die Verbindung zu einem anderen server
Arbeite ich auf einer älteren VB6-app. Die app verwendet die RAS-API zum herstellen einer modem-Verbindung, dann verwendet eine winsock-Steuerelement eine Verbindung zu einer IP-Adresse & port.
Ich bin jetzt hinzufügen "failover" - Funktion, um diese app wo, wenn es kann keine Verbindung zu einem server, es versucht, eine Verbindung zum nächsten in der Liste.
Sagen wir, ich habe zwei server, server-app und die server-app B. (Bei meinen tests habe ich tauschte diese um zu überprüfen, dass beide Server sind erreichbar und es gibt keine routing - /firewall-Probleme.)
Wenn ich halt server app Ein, dann ist etwas ganz seltsames passiert, wenn die app versucht, eine Verbindung zum server-app Ein und anschließend die server-app B:
mySocket.close
mySocket.Connect serverA, portA
- mySocket.state = 6 sckConnecting
- socket-connect-Ereignis aufgerufen wird
- mySocket.state = 7 sckConnected
- mySocket.Status = 8 sckClosing
(das scheint etwas seltsam: ich bin mir nicht sicher, warum es angezeigt wird, schließen Sie für ein paar Momente.)
Die Buchse bleibt im sckClosing Zustand. Nach ein paar hundert Millisekunden, ich bewege mich auf, zu versuchen, eine Verbindung zu server B:
mySocket.close
- mySocket.state = 0 sckClosed
.
mySocket.Connect serverB, portB
- mySocket.state = 6 sckConnecting
- socket error-Ereignis aufgerufen wird mit Fehler 10060 (WSAETIMEDOUT)
- mySocket.state = 9 sckError
An diesem Punkt, wenn ich start server app Ein, eine RAShangup und ein RASdial und versuchen, eine Verbindung zum server Ein, funktioniert alles OK.
Es ist, als wenn die Sequenz
socket.connect ip, port
socket.close
socket.connect newIP, newPort
funktioniert nicht ordnungsgemäß, wenn ein RAShangup und RASdial eingefügt wird. Stattdessen schlägt er mit WSAETIMEDOUT.
Ist es etwas, was ich tun müssen, zwischen Nähe und Verbindung nennen?
Hinweis: ich habe versucht, machen Sie sicher, dass die close call hat wirklich geschlossen, aber das hilft nicht:
Private Sub closeSocket(ByRef w As Winsock)
w.Close
Do While (w.State <> sckClosed)
DoEvents
Loop
End Sub
InformationsquelleAutor Simon Elliott | 2011-06-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nachdem wir uns wieder an dem Projekt, es stellt sich heraus, dass eine frühere Entwickler der LocalPort-Eigenschaft des winsock-Steuerelements auf einen Wert ungleich null. Dies verhindert die erneute Verwendung des winsock-Steuerelement.
Setzen Sie dies auf null bewirkt, dass ein zufälliger lokaler port ausgewählt werden, wodurch die Kontrolle wieder verwendet werden.
Lektion gelernt: beim Umgang mit VB6 ich sehen müssen das die Einstellungen für die Eigenschaft als auch den Quell-code.
InformationsquelleAutor Simon Elliott
Bemerkte ich einige fehlerhaftes Verhalten beim schließen des port. Ich könnte nicht re-öffnen Sie den port mit der Konsistenz. Fix: hinzufügen von ein DoEvents nach dem close-Befehl.
InformationsquelleAutor user10090164