如何通过 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 控件的最佳名称,最好给它一个更独特的名称,可以像wskConnection
或wskTerminal
一样简单
当您下载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 数据?