【问题标题】:vb6 winsock control RemoteHostIP truncates the last digit from IP addressvb6 winsock控制RemoteHostIP截断IP地址的最后一位
【发布时间】:2011-03-13 08:37:51
【问题描述】:

您好,我正在用 VB6 编写一个套接字客户端/服务器应用程序。 我有以下代码

Private Sub sockMain_ConnectionRequest(ByVal requestID As Long)
    If sockMain.State <> sckClosed Then
        sockMain.Close
    End If
    sockMain.Accept requestID    
    Debug.Print "Accepted connection from: " & sockMain.RemoteHostIP & vbCrLf
End Sub

它打印 IP 但最后一位数字丢失的例子,如果我的连接来自“192.168.1.123”,那么它只显示“192.168.1.12”

【问题讨论】:

  • 如果建立了套接字连接,您确定连接是从 192.168.1.123 建立的。您是否检查了 tcpview 软件中显示为远程 IP 的 IP。
  • 如果 IP 显示 192.168.1.123 那么我的套接字 API 没有任何问题。问题在于您打印 IP 的方式。
  • 我能够看到活动连接并能够传输数据,并且在调试模式下,如果我检查连接状态,则套接字仅处于连接状态。连接没有问题。但是控制 RemoteHostIP 总是通过截断最后一位来显示 IP,我是从本地连接客户端,我得到 127.0.0。而不是 127.0.0.1

标签: vb6 tcp network-programming sockets winsock


【解决方案1】:

我已经尝试了完全相同的代码,它可以在我的机器上运行。我尝试在同一台机器和笔记本电脑上使用 telnet,两种情况下都打印了正确的 IP 地址。

我必须同意 ckv 并说它是您打印RemoteHostIP 的方式。

【讨论】:

  • 如果您使用完全相同的代码,您也必须使用相同的功能来打印 IP 对吗?因此,您的意思是使用与 Dharma 上面提到的相同的代码,您将获得正确的 IP。
  • 嗨 CKV 和 quamrana,我仍然不明白为什么在我的系统中缺少最后一个数字。即使我为套接字对象设置了监视并在调试期间进行了检查,仍然会通过截断最后一个字符来显示 RemoteHostIP。
  • @Dharma:好吧,那很糟糕。你能在一些不同的硬件/操作系统上尝试最小版本的程序吗?
  • 除了vb6 winsock control,其他编程语言线VC++、C#和VB.Net我都能得到RemoteIP地址完整。
  • @Dharma:那么您使用什么硬件/操作系统来获得您在问题中描述的症状?
【解决方案2】:

这是 v1 和 2009 年 5 月 v2 中的 KB957924 Microsoft Visual Basic 6.0 Service Pack 6 累积更新 (link) 中的一个已知错误。这就是为什么有些人可以复制它而有些人不能。它也仅限于控件的第二次和后续使用。

正在讨论here

作为一个非常丑陋的解决方法,您可以使用 sockMain.SocketHandle、一个小缓冲区和 MSG_PEEK 参数 (&amp;H2) 在 wsock32.dll 库中调用 recvfrom 以直接检索套接字地址。这必须在调用sockMain.GetData() 之前完成。然后你必须自己解析出IP地址。如果需要,我可以针对我正在使用的特定情况 (UDP) 发布执行此操作的代码。

我不确定它是否适用于你的情况,因为看起来你正在使用 TCP 和接受。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-18
    • 2014-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多