2013-02-11 41 views
-2

當我在windows 2008 32位服務器中運行下面的代碼時,當調用connect()時,程序流轉到sckTest_Error()。在連接到Windows 2008中的端口0時出現的不同行爲32/64位

但是當我在Windows中運行相同的代碼,2008年64位服務器,RTE發生和程序流轉到錯誤:

Private Sub Form_Load() 
On Error GoTo error1 
    If (Not (Me.sckTest.State = sckConnected)) Then 
     ' 
     'Log event for outbound client mode connectoin 

     If Me.sckTest.State <> sckClosed Then 
      Me.sckTest.Close 
     End If 
     ' 
     MsgBox "Going to connect" 
     Me.sckTest.Connect "127.0.0.1", 0 
     MsgBox "Connecting" 
     If Me.sckTest.State = sckConnected Then 
     MsgBox "Connected" 
     End If 
     ' 
    End If 
    Exit Sub 
error1: 
    MsgBox "RTE " & Err.Number 
End Sub 


Private Sub sckTest_Error(ByVal Number As Integer, 
          Description As String, 
          ByVal Scode As Long, 
          ByVal Source As String, 
          ByVal HelpFile As String, 
          ByVal HelpContext As Long, 
          CancelDisplay As Boolean) 
    MsgBox "Error in connecting" & Number 
End Sub 

但我得到的錯誤在兩個服務器10049。任何人都可以請我的代碼或服務器行爲的問題。

感謝

+0

你爲什麼試圖連接到端口零? – EJP 2013-02-11 16:57:03

回答

0

端口0是一個特殊的通配符,它​​允許一個套接字綁定到一個隨機提供ephimeral端口。綁定成功後,您可以查詢套接字以發現綁定的實際端口。因此,您無法將客戶端套接字連接到端口0,因爲服務器套接字無法在第一個位置監聽端口0。

+0

是的..我同意你關於端口0.由於這是一個已經開發的產品,它已經被編程,就像客戶端配置的任何端口一樣,系統應該連接到它。客戶端有時可能不需要連接到任何端口,他們將設置值爲0.那時,我們得到了10049錯誤。我的問題是,爲什麼當10049發生時,win2k8認爲它是RTE,而win2k3調用sckTest_Error事件? – Santhanam 2013-02-12 04:39:51

+0

WinSock在不同操作系統版本內部的工作方式有所不同,就這些。有時可以立即檢測到連接錯誤,而不嘗試連接到服務器,導致RTE情況,有時候只有在嘗試連接後才能檢測到錯誤,導致出現'sckTest_Error'情況。你的代碼沒有問題。只是處理這兩種情況,你會沒事的。 – 2013-02-12 10:34:31

+0

@Santhanam如果客戶端不想連接到任何端口,它根本不應該調用connect()。這沒有多大意義。 – EJP 2013-02-12 11:50:58

相關問題