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

时间:2014-09-18 19:16:21

标签: vb6 winsock tcp-ip

我需要创建一个需要从外部终端预订设备检索数据到我的应用程序的应用程序,使用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

提前致谢

2 个答案:

答案 0 :(得分:0)

您发送例行程序错误:

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控件发送

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

strSData = strSData & vbCr

答案 1 :(得分:0)

DataArrival事件名称错误:

你的代码中的

是:

Private Sub terminalConnector_DataArrival(ByVal bytesTotal As Long)

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

Private Sub Winsock_DataArrival(ByVal bytesTotal As Long)

您始终可以在IDE中代码窗口左上方的组合框中选择控制名称,然后在IDE中代码窗口右上方的组合框中选择事件名称,这将显示事件代码的大纲在你的代码窗口中。

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

旁注:Winsock可能不是winsock控件的最佳名称,最好给它一个更独特的名称,这可以像wskConnection或{{1}一样简单}

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