gpt4 book ai didi

VB6 winsock控制: closing a connection and connecting to another server

转载 作者:行者123 更新时间:2023-12-04 15:46:00 27 4
gpt4 key购买 nike

我正在开发旧版 VB6 应用程序。该应用程序使用 RAS API 建立调制解调器连接,然后使用 winsock 控件连接到 IP 地址和端口。

我现在正在向这个应用程序添加一个“故障转移”功能,如果它无法连接到服务器,它会尝试连接到列表中的下一个。

假设我有两台服务器,服务器应用程序 A 和服务器应用程序 B。(在测试期间,我交换了这些服务器以验证两台服务器都可以访问并且没有路由/防火墙问题。)

如果我停止服务器应用程序 A,那么当应用程序尝试连接到服务器应用程序 A 和服务器应用程序 B 时,会发生一些非常奇怪的事情:

mySocket.close
mySocket.Connect serverA, portA
  • mySocket.state = 6 sckConnecting
  • 套接字连接事件被调用
  • 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

    最佳答案

    再次查看项目后发现,以前的开发人员将 winsock 控件的 LocalPort 属性设置为非零值。这阻止了winsock控件的重用。

    将此设置为零会导致选择一个随机的本地端口,从而允许重用控件。

    经验教训:处理 VB6 时,我需要查看属性设置以及源代码。

    关于VB6 winsock控制: closing a connection and connecting to another server,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6356010/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com