2013-02-11 1 views
-2

Когда я запускаю приведенный ниже код в 32-битном сервере Windows 2008, поток программы переходит к sckTest_Error() при вызове connect().Различное поведение при подключении к порту 0 в Windows 2008 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

ответ

0

Порт 0 является специальным подстановочной, что позволяет сокет для привязки к случайному доступному ephimeral порта. После успешного связывания вы можете запросить сокет, чтобы узнать, к какому фактическому порту он привязан. Таким образом, вы не можете подключить клиентский сокет к порту 0, потому что серверный сокет не может прослушивать порт 0 в первую очередь.

+0

Да. Я согласен с вами в отношении порта 0. Поскольку это уже разработанный продукт, он уже был запрограммирован, как и любой порт, который настраивается клиентом, и система должна подключиться к нему. Клиенту иногда не нужно подключаться к любому порту, в то время они будут устанавливать значение равным 0. В это время мы получаем ошибку 10049. Мой вопрос здесь в том, почему, когда возникает 10049, win2k8 считает его RTE, тогда как win2k3 вызывает событие sckTest_Error? – Santhanam

+0

Существуют различия в том, как WinSock работает внутри разных версий ОС, вот и все. Иногда ошибка соединения может быть обнаружена немедленно, не пытаясь подключиться к серверу, в результате чего возникает случай RTE, а в других случаях ошибка может быть обнаружена только после попытки подключения, в результате чего возникает сценарий «sckTest_Error». В коде нет ничего плохого. Просто обрабатывайте оба случая, и с вами все будет в порядке. –

+0

@Santhanam Если клиент не хочет подключаться к любому порту, он не должен звонить connect() вообще. Это не имеет большого смысла. – EJP