如何通过 Winsock 从外部设备检索数据到 Microsoft Visual Basic (VB6)

Posted

技术标签:

【中文标题】如何通过 Winsock 从外部设备检索数据到 Microsoft Visual Basic (VB6)【英文标题】:How to retrieve data from external device through Winsock to Microsoft Visual Basic (VB6) 【发布时间】:2014-09-18 19:16:20 【问题描述】:

我需要创建一个应用程序,该应用程序需要通过 telnet 连接将数据从外部终端预订设备检索到我的应用程序,并将其显示在 txtOutput 文本框上。

我是 VB 的新手,花了一些时间学习该语言的基础知识。

首先,我创建了一个标准 EXE 项目并将 Winsock 控件添加到表单中。 我也向我想要连接的 IP 地址发出了 ping 请求,它可以正常工作。

然后我想向外部设备发送命令。我希望预订终端向我提供对 txtOutput 的反馈以供我阅读。

我建立了连接,据我所知,我确实将消息发送到终端。但我没有得到任何回应!在我的 txtOutput 上看不到任何内容。

怎么可能?

这是我的代码:

Dim IPAddress As String
Dim PortNum As Integer

Private Sub cmdConnect_Click()    
    Winsock.Close
    Winsock.RemoteHost = txtIpaddress.Text
    IPAddress = Winsock.RemoteHost
    PortNum = CStr(txtPortnr.Text)
    If (Val(PortNum) > 65535) Then
        Winsock.RemotePort = (Val(PortNum) - 65535)
        PortNum = Winsock.RemotePort
    Else
        Winsock.RemotePort = Val(PortNum)
        PortNum = Winsock.RemotePort
    End If

    Winsock.Connect

    Module1.send_to_buffer ("Attempting connection to: " & IPAddress & ":" & CStr(PortNum))

    Call wsock_status
    End Sub

Private Sub Winsock_Connect()
    Module1.send_to_buffer ("Succeeded connection to: " & IPAddress & ":" & CStr(PortNum))
    txtSend.SetFocus
End Sub

Private Sub cmdSend_Click()
Dim strSData As String
Dim message_to_send As String
    If (Winsock.State = 0) Then
        Module1.send_to_buffer ("You need to connect first!")
        txtSend.Text = ""
    Else
        strSData = txtSend.Text
        Winsock.SendData strSData & vbCrLf
        message_to_send = txtSend.Text
        If (message_to_send <> "") Then
            Winsock.SendData message_to_send & vbCrLf
            Module1.send_to_buffer_norm (txtSend.Text)
            txtSend.Text = ""
            txtSend.SetFocus
        Else
            Module1.send_to_buffer ("Nothing to send!")
            txtSend.Text = ""
            txtSend.SetFocus
        End If
    End If
End Sub

Private Sub terminalConnector_DataArrival(ByVal bytesTotal As Long)
Dim strData As String
    Winsock.GetData strData

    If (Len(txtOutput.Text) = 0) Then
        txtOutput.Text = strData & vbCrLf
    Else
        txtOutput.Text = txtOutput.Text & strData & vbCrLf
    End If
    End Sub

Private Sub cmdDisconnect_Click()
Dim Counter As Long
    If (Winsock.State <> 0) Then
        Winsock.Close
        Call wsock_status
        Module1.send_to_buffer ("Connection to " & IPAddress & ":" & CStr(PortNum) & " closed.")
    End If
End Sub

Private Sub Winsock_Close()
    Module1.send_to_buffer ("Disconnected from: " & IPAddress & ":" & CStr(PortNum))
    Winsock.Close
End Sub

和Module1代码:

Public Function send_to_buffer(text_to_display As String)
    If (Len(terminalConnector.txtOutput.Text) = 0) Then
        terminalConnector.txtOutput.Text = "*** " & text_to_display
    Else
        terminalConnector.txtOutput.Text = terminalConnector.txtOutput.Text & vbCrLf & "*** " & text_to_display & vbCrLf & vbCrLf
    End If
End Function

Public Function send_to_buffer_norm(text_to_input As String)
    If (Len(terminalConnector.txtOutput.Text) = 0) Then
        terminalConnector.txtOutput.Text = "> " & text_to_input & vbCrLf
    Else
        terminalConnector.txtOutput.Text = terminalConnector.txtOutput.Text & "> " & text_to_input & vbCrLf
    End If
End Function

提前致谢

【问题讨论】:

这里有问题吗?我们看到您的代码,但您没有指出问题所在。尝试保存时是否出现错误? 我已经编辑了文本,谢谢 你说的这个“终端”是什么?您的回答对任何解决方案都有重要影响。但是刚开始您的程序可能必须是 TCP 服务器,而不是客户端,此外,大多数称为“终端”的设备都需要一些最小的协议层,例如Telnet,位于 TCP 之上。 我所说的终端,就像你在下班预约时使用的预约终端。 Telnet 连接只是基于 TCP/IP 的协议;您必须主要通过 TCP 发送和接收纯文本和一些控制代码。我建议您了解 telnet 协议 - 例如这里:pcmicro.com/netfoss/telnet.html - 并实现您所需的子集。 【参考方案1】:

DataArrival 事件命名错误:

在你的代码中是:

Private Sub terminalConnector_DataArrival(ByVal bytesTotal As Long)

但它应该是您的 winsock 控件的名称:

Private Sub Winsock_DataArrival(ByVal bytesTotal As Long)

您始终可以在 IDE 中的代码窗口上方左侧的组合框中选择控件名称,然后在 IDE 中的代码窗口上方的右侧组合框中选择事件名称,这将放置事件代码的轮廓在您的代码窗口中。

或者您可以在 IDE 中双击设计窗口上的控件,这将带您进入代码窗口并将事件代码的轮廓放在您的代码窗口中.. 然后您可以选择您想要的事件代码窗口右上方的组合框

附注:Winsock 可能不是winsock 控件的最佳名称,最好给它一个更独特的名称,可以像wskConnectionwskTerminal 一样简单

当您下载MZ-tools 时,您可以“查看源代码”,它会向您显示任何不会在您的程序中调用或使用的过程和变量...这通常会给错误命名的变量或过程提供额外的提示

【讨论】:

感谢 Hrqls,帮了大忙,现在我收到了回复!但我无法阅读/理解它。连接终端后得到的反馈是:ÿý↑。这是什么意思,有没有办法把它翻译成可读的字符串? 数据可能已编码/加密?使用 telnet 时是否收到可读数据? 我在使用端口 23 时收到奇怪的反馈 那么你的程序工作正常,你只需要找到一种方法来解码接收到的数据:) 当我的问题得到回答后,我会将您的答案标记为正确答案,并为此翻译 telnet 数据提出一个新问题 :)【参考方案2】:

你的发送程序是错误的:

Private Sub cmdSend_Click()
  Dim strSData As String
  txtSend.Text = strSData
  Winsock.SendData strSData
End Sub

您在 txtSend 中显示 strSata ... 而 strSData 仍然是一个空字符串 .. 之后您通过 Winsock 控件发送空字符串

你可能是说:

Private Sub cmdSend_Click()
  Dim strSData As String
  strSData = txtSend.Text
  Winsock.SendData strSData
End Sub

它将 txtSend.Text 读入你的字符串变量,然后通过 Winsock 控件发送它

服务器可能想要在你的字符串末尾添加一些特殊字符,所以不要忘记添加它...通常你必须添加一个回车符:

strSData = strSData & vbCr

【讨论】:

:) 它发生在我们最好的人身上 :) .... 随意接受这个作为完成这个的答案。 我愿意,但我还没说完:/我已经更新了我的问题。我可以发送数据,我想我也可以接收数据,但我的文本框没有任何输出

以上是关于如何通过 Winsock 从外部设备检索数据到 Microsoft Visual Basic (VB6)的主要内容,如果未能解决你的问题,请参考以下文章

如何轻松检索我的全部或部分外部 IP 地址(在 Android 设备上)?

如何将 Blowfish 加密添加到 Winsock 数据?

缺少 UDP 发送的数据包

将数据从 iOS 应用程序发送到外部连接的非 iOS 设备

Android:如何将通过USB连接的外部条形码扫描仪设备集成到Android应用程序[关闭]

Tomcat如何实现NIO