vb6winsock控件RemoteHostIP截断IP地址最后一位数字

发布于 2024-09-08 08:12:27 字数 414 浏览 5 评论 0 原文

您好,我正在用 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”

Hi i am writing a socket client/server application in VB6.
i have the following code

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

its printing the IP but the last digit is missing example, if my connection is from "192.168.1.123" then it shows "192.168.1.12" only

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

心病无药医 2024-09-15 08:12:27

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

我必须同意 ckv 的观点,并说这是您打印 RemoteHostIP 的方式。

I've tried the exact same code and it works on my machine. I tried using telnet from the same machine, and also from a laptop and the correct IP address was printed in both cases.

I have to agree with ckv and say that its the way you are printing RemoteHostIP.

無心 2024-09-15 08:12:27

这是 KB957924 Microsoft Visual Basic 6.0 Service Pack 6 累积更新 (链接)。这就是为什么有些人可以复制它而有些人则不能的原因。它还仅限于该控件的第二次和后续使用。

此处对此进行了讨论。

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

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

This is a known bug in KB957924 Microsoft Visual Basic 6.0 Service Pack 6 Cumulative Update (link) in both v1 and May 2009 v2. This is why some people can duplicate it and some can't. It also is limited to the second and subsequent usage of the control.

It is discussed here.

As a really ugly workaround you can call recvfrom in the wsock32.dll lib with the sockMain.SocketHandle, a small buffer and the MSG_PEEK parameter (&H2) to retrieve the socket address directly. This must be done before calling sockMain.GetData(). Then you have to parse out the IP address yourself. I can post code that does this for the specific case I'm using (UDP) if requested.

I'm not sure it will work in your case since it looks like you're using TCP and Accept.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文