Tcp 在windows 2008 32/64位中连接端口0时的不同行为
在windows 2008 32位服务器中运行以下代码时,调用connect()时,程序流转到sckTest_Error() 但当我在windows 2008 64位服务器上运行相同的代码时,会出现RTE,程序流出错: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
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的实践可以追溯到更远的地方。