2011-06-15 62 views
3

我正在使用傳統的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 

回答

2

在項目再次尋找後,事實證明,以前的開發人員設置的將winsock控件的LocalPort屬性設置爲非零值。這阻止了winsock控件的重用。

將其設置爲零會導致選擇一個隨機本地端口,從而允許重新使用該控件。

獲得的經驗:在處理VB6時,我需要查看屬性設置以及源代碼。

+2

好的。程序員在每次設置Connect調用時都應該清零該屬性,因爲如果不是在首次編寫程序時需要重新使用控件,這種情況並不罕見。這有點像在使用之前清除任何「全局」變量,但這種特殊情況對人們來說不會造成問題。第一次做,不要遲到。 – Bob77 2011-06-15 16:57:26

相關問題