vb6 winsock control RemoteHostIP截断IP地址的最后一位数字

vb6 winsock control RemoteHostIP截断IP地址的最后一位数字,vb6,tcp,network-programming,sockets,winsock,Vb6,Tcp,Network Programming,Sockets,Winsock,您好,我正在用VB6编写一个套接字客户机/服务器应用程序。 我有以下代码 Private Sub sockMain_ConnectionRequest(ByVal requestID As Long) If sockMain.State <> sckClosed Then sockMain.Close End If sockMain.Accept requestID Debug.Print "Accepted connectio

您好,我正在用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
Private Sub-sockMain\u ConnectionRequest(ByVal requestID尽可能长)
如果sockMain.State sckClosed,则
索克曼,关门
如果结束
接受请求ID
Debug.Print“已接受的连接自:”&sockMain.RemoteHostIP&vbCrLf
端接头

它正在打印IP,但缺少最后一个数字示例,如果我的连接来自“192.168.1.123”,则它仅显示“192.168.1.12”

我尝试了完全相同的代码,并且它在我的机器上工作。我试着从同一台机器和笔记本电脑上使用telnet,两种情况下都打印了正确的IP地址


我必须同意ckv的说法,这是您打印
RemoteHostIP

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

对其进行了讨论

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


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

如果已建立套接字连接,您确定已从192.168.1.123建立连接。您是否检查了tcpview软件中显示为远程IP的IP。如果IP显示为192.168.1.123,则套接字API没有任何问题。问题在于您打印IP的方式。我可以看到活动连接并能够传输数据,在调试模式下,如果我检查连接状态,则套接字仅处于连接状态。连接没有问题。但是RemoteHostIP控件总是通过截断最后一个数字来显示IP,即我从本地连接客户端,我得到127.0.0。而不是127.0.0.1如果使用完全相同的代码,则必须使用相同的函数来打印IP,对吗?所以你的意思是,用上面提到的达摩相同的代码,你得到了正确的IP。嗨,CKV和quamrana,我仍然不明白为什么我的系统中最后一个数字丢失了。即使我为套接字对象设置了一个手表并在调试过程中进行了检查,仍然会通过截断最后一个字符来显示RemoteHostIP。@Dharma:好的,这很糟糕。您能在一些不同的硬件/操作系统上尝试该程序的最低版本吗?除了vb6 winsock控件,其他编程语言行VC++、C#和VB.Net,我能够获得完整的RemoteIP地址。@Dharma:那么您使用什么硬件/操作系统来获得您在问题中描述的症状呢?