我正在使用傳統的VB6應用程序。該應用程序使用RAS API建立調制解調器連接,然後使用winsock控件連接到IP地址&端口。VB6 winsock控件:關閉連接並連接到另一臺服務器
我現在爲這個應用程序添加一個「故障轉移」功能,如果它無法連接到服務器,它會嘗試連接到列表中的下一個。
比方說,我有兩臺服務器,服務器應用A和服務器應用程序B.(在我的測試中,我換這些各地檢驗兩臺服務器可以訪問並沒有路由/防火牆問題。)
mySocket.close
mySocket.Connect serverA, portA
- mySocket.state = 6 sckConnecting
- 插座連接的事件是:如果我停止服務器應用程序A,然後東西很奇怪,當應用程序試圖連接到服務器的應用程序A,然後服務器應用B發生稱爲
- mySocket.state = 7 sckConnected
- mySocket.state = 8 sckClosing
(這似乎有點奇怪:我不知道爲什麼它似乎連接了一會兒。)
套接字保持sckClosing狀態。幾百毫秒後,我繼續前進,試圖連接到服務器B:
mySocket.close
- mySocket.state = 0 sckClosed
。
mySocket.Connect serverB, portB
- mySocket.state = 6 sckConnecting
- 套接字錯誤事件被稱爲錯誤10060(WSAETIMEDOUT)
- mySocket.state = 9 sckError
此時如果我開始服務器應用程序A,執行RAShangup和RASdial,並嘗試連接到服務器A,一切正常。
這是因爲如果該序列
socket.connect ip, port
socket.close
socket.connect newIP, newPort
除非RAShangup和RASDIAL插入不能正常工作。相反,它會失敗,WSAETIMEDOUT。
關閉和連接呼叫之間需要做什麼嗎?
注:我試過在確認千鈞一髮真的關閉,但是這並不能幫助:
Private Sub closeSocket(ByRef w As Winsock)
w.Close
Do While (w.State <> sckClosed)
DoEvents
Loop
End Sub
好的。程序員在每次設置Connect調用時都應該清零該屬性,因爲如果不是在首次編寫程序時需要重新使用控件,這種情況並不罕見。這有點像在使用之前清除任何「全局」變量,但這種特殊情況對人們來說不會造成問題。第一次做,不要遲到。 – Bob77 2011-06-15 16:57:26