Tcp 在windows 2008 32/64位中连接端口0时的不同行为

Tcp 在windows 2008 32/64位中连接端口0时的不同行为,tcp,windows-server-2008,windows-server-2003,winsock,Tcp,Windows Server 2008,Windows Server 2003,Winsock,在windows 2008 32位服务器中运行以下代码时,调用connect()时,程序流转到sckTest_Error() 但当我在windows 2008 64位服务器上运行相同的代码时,会出现RTE,程序流出错: Private Sub Form_Load() On Error GoTo error1 If (Not (Me.sckTest.State = sckConnected)) Then ' 'Log event for outbound

在windows 2008 32位服务器中运行以下代码时,调用connect()时,程序流转到sckTest_Error()

但当我在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
Private子表单_Load()
关于错误转到错误1
如果(不是(Me.sckTest.State=sckConnected)),则
'
'出站客户端模式连接的日志事件
如果Me.sckTest.State sck关闭,则
Me.sckTest.Close
如果结束
'
MsgBox“将要连接”
Me.sckTest.Connect“127.0.0.1”,0
MsgBox“正在连接”
如果Me.sckTest.State=SCK已连接,则
MsgBox“已连接”
如果结束
'
如果结束
出口接头
错误1:
MsgBox“RTE”和错误编号
端接头
私有子sckTest_错误(ByVal数为整数,
描述为字符串,
拜瓦尔·斯考德,只要,
ByVal源作为字符串,
ByVal帮助文件作为字符串,
拜瓦尔:只要,
取消显示为布尔值)
MsgBox“连接错误”&编号
端接头
但我在两台服务器上都得到了10049的错误。请问我的代码或服务器行为有什么问题


谢谢端口0是一个特殊的通配符,它允许套接字绑定到随机可用的ephimeral端口。绑定成功后,可以查询套接字以发现它绑定到的实际端口。因此,您无法将客户端套接字连接到端口0,因为服务器套接字首先不可能侦听端口0。

为什么要尝试连接到端口0?是的。。关于端口0,我同意你的看法。由于这是一个已经开发的产品,它已经像客户端配置的端口一样编程,系统应该连接到它。客户端有时可能不需要连接到任何端口,此时他们会将该值设置为0。当时,我们得到的是10049错误。我的问题是,为什么当出现10049时,win2k8将其视为RTE,而win2k3调用sckTest_错误事件?WinSock在不同操作系统版本下的内部工作方式存在差异,仅此而已。有时,在不尝试连接到服务器的情况下可以立即检测到连接错误,从而导致RTE情况,而其他时候,只有在尝试连接后才能检测到错误,从而导致
sckTest_错误
情况。你的代码没有问题。只要处理这两种情况,您就可以了。@Santhanam如果客户端不想连接到任何端口,它就不应该调用connect()。这没什么意义是的。。谢谢你的建议EJP。我会像你一样申请fixsaid@InTheNameOfScience至少自1992年Windows 3.1前后引入Winsock 1.0以来,就一直支持绑定到端口0以获取临时端口。但是TCP套接字API早于Winsock,所以我确信使用端口0的实践可以追溯到更远的地方。