none
利用TcpClient撰寫Telnet程序問題。 RRS feed

  • 問題

  • 小弟近來要寫一個TELNET的程序,寫的過程中,我發現了兩個問題,第一個問題是,利用TcpClient連接去某server的時候,出現了一些亂碼字,如:

    http://www.qoos.com/photos/uploads/39946/p1.JPG

    第二個問題是,當telnet進去server,輸入login name和password之後,我的程序收不了server的output,為甚麼會出現這個情況?請問有沒有一個event是處理server的回應?同時,DataAvailable這個Property甚麼時候才會True,小弟真是搞不懂整個流程是怎樣的?

    以下是小弟所寫的程序的部分source code,請指教:

    [code]

         Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            menDisconnect.Enabled = False
            connectionPro = New ConnectionProperties

        End Sub
        Private Sub DoRead(ByVal ar As IAsyncResult)
            Dim bytesRead As Integer
            Dim strMessage As String

            Try
                bytesRead = client.GetStream().EndRead(ar)

                If bytesRead < 1 Then
                    MessageBox.Show("Disconnected")
                    client.Close()
                    menConnect.Enabled = True
                    menDisconnect.Enabled = False
                    rtxtShow.Enabled = False
                    btnSend.Enabled = False

                End If
                strMessage = ASCII.GetString(readBuffer, 0, bytesRead)
                rtxtShow.Text += strMessage
                client.GetStream().BeginRead(readBuffer, 0, READ_BUFFER_SIZE, New AsyncCallback(AddressOf DoRead), Nothing)
                If Regex.IsMatch(strMessage, "[Passowrd]") Then
                    'MessageBox.Show(strMessage, "Alert", MessageBoxButtons.OK)


                End If
            Catch ex As Exception
                MessageBox.Show(ex.Message)

            End Try
        End Sub

        Private Sub SendData(ByVal data As String)

            Try
                SyncLock client.GetStream()
                    Dim writer As StreamWriter = New StreamWriter(client.GetStream())
                    writer.Write(data + Chr(13))
                    writer.Flush()
                End SyncLock
            Catch ex As Exception
                rtxtShow.Text = ex.Message
            End Try

     

        End Sub

        Private Sub btnSend_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSend.Click
            SendData(txtCmd.Text)
        End Sub

        Private Sub menConnect_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles menConnect.Click
            rtxtShow.Text = Nothing
            If connectionPro.IP = "" Then
                MessageBox.Show("Please go to Option -> Configuration setup the connection properties.")
                Exit Sub
            End If
            Try
                client = New TcpClient(connectionPro.IP, connectionPro.PortNum)
                Dim result As String
                client.GetStream.BeginRead(readBuffer, 0, READ_BUFFER_SIZE, New AsyncCallback(AddressOf DoRead), Nothing)
                rtxtShow.Enabled = True
                menConnect.Enabled = False
                menDisconnect.Enabled = True


                If connectionPro.Username = "" Then
                    SendData(connectionPro.Password)
                Else
                    SendData(connectionPro.Username)
                    SendData(connectionPro.Password)

                End If
                btnSend.Enabled = True
            Catch ex As Exception
                MsgBox("Can not connect to the server. Error: " + ex.Message)


            End Try

        End Sub

        Private Sub menDisconnect_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles menDisconnect.Click
            client.Close()
            rtxtShow.Enabled = False
            menConnect.Enabled = True
            menDisconnect.Enabled = False
            MessageBox.Show("Disconnected!")
            btnSend.Enabled = False

        End Sub

        Private Sub menExit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles menExit.Click
            Me.Dispose()
        End Sub

        Private Sub menConfigure_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles menConfigure.Click
            connectionPro.ShowDialog()
        End Sub

    [/code]

     

    2006年7月31日 上午 09:05

解答

  • 如果你是指裡面的中文字,請用 big5 轉換,用 ASCII 會把大於 127 的都變問號。

    我用的測試程式碼:

     Public Function ConnectServer(Optional ByVal strServer As String = "", Optional ByVal nPort As Integer = 23) As String
      If Len(strServer) > 0 Then
       telnetServer = strServer
       telnetPort = nPort
      End If

      If Len(telnetServer) > 0 Then
       m_TcpClient.SendTimeout = m_TimeOut
       m_TcpClient.ReceiveTimeout = m_TimeOut
       Try
        m_TcpClient.Connect(telnetServer, telnetPort)
       Catch
        Return ""
       End Try

       m_NetworkStream = m_TcpClient.GetStream()

       Return BytesToString(GetReturnBytes(), modStrTools.enuStandardCodePages.SCP_big5)
      End If

     End Function

    測試目標:成大資工 BBS,telnet://iie.twbbs.org/

    傳回:

    ?? ??? [;H [2J
       ╭╤══╤═══╤═══╤═══╤═══╤═══╤═══╤═══╤══╤╮
       ╟┴┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬┴╢
       ╟┬┴─┬─┴─┬╔══════════════════╗─┴─┬─┴┬╢
       ╟┴┬─┴─┬─┴║     成 功 大 學 電 子 佈 告 欄     ║─┬─┴┬─┴╢
       ╟┬┴─┬─┴─┬╚══════════════════╝─┴─┬┴─┬╢
       ╟┴┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬┴╢
       ╟┬┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┼─┬─┴─┬─┴─┬─┴┬╢
       ╟┴╭─╮╭╮╭───╮╭─╮╭╮╭-╮╭-╮    ╭─╮╭─╮╭───╮┴╢
       ╟┬│  ╰┘││  ╭╮││  └╯││ ││ │    │  ││  ││  ╭─╯┬╢
       ╟┴│      ││  │╰╯│    ╭╯│ ╰╯ │    │  ││  ││  ╰─╮┴╢
       ╟┬│      ││  │    │    │  │      │    │  ││  ││      │┬╢
       ╟┴│      ││  │╭╮│    ╰╮│      │    │  ││  ││  ╭─╯┴╢
       ╟┬│┌╮  ││  ╰╯││  ┌╮││      │    │  ││  ││  ╰─╮┬╢
       ╟┴╰╯╰─╯╰───╯╰─╯╰╯╰───╯    ╰─╯╰─╯╰───╯┴╢
       ╟─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┼─╢
       ╟┬┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴┬╢
       ╟┴┬─┴─┬─┴─┬─┴─  資 訊 工 程 系 所   ─┬─┴─┬─┴─┬┴╢
       ╰═╧═══╧═══╧═══════════════╧═══╧═══╧═╯ [21;1H現在上線人數 [47;30m 36 [m 人
    最高上線人數 [1600]人
    請輸入代號(參觀請輸入 'guest',註冊請輸入 'new'): [7m             [m [23;49H

    註:有些東西是 BBS 用的控制碼,我沒解。

    2006年8月13日 下午 02:46
    版主

所有回覆

  • 我想 ...

    你可以把你擷取訊息的 System.Text.Encoding.ASCII.GetString()
    改成 System.Text.Encoding.Default.GetString() 看看能否解決亂碼問題 .

    2006年8月13日 下午 12:21
    版主
  • 如果你是指裡面的中文字,請用 big5 轉換,用 ASCII 會把大於 127 的都變問號。

    我用的測試程式碼:

     Public Function ConnectServer(Optional ByVal strServer As String = "", Optional ByVal nPort As Integer = 23) As String
      If Len(strServer) > 0 Then
       telnetServer = strServer
       telnetPort = nPort
      End If

      If Len(telnetServer) > 0 Then
       m_TcpClient.SendTimeout = m_TimeOut
       m_TcpClient.ReceiveTimeout = m_TimeOut
       Try
        m_TcpClient.Connect(telnetServer, telnetPort)
       Catch
        Return ""
       End Try

       m_NetworkStream = m_TcpClient.GetStream()

       Return BytesToString(GetReturnBytes(), modStrTools.enuStandardCodePages.SCP_big5)
      End If

     End Function

    測試目標:成大資工 BBS,telnet://iie.twbbs.org/

    傳回:

    ?? ??? [;H [2J
       ╭╤══╤═══╤═══╤═══╤═══╤═══╤═══╤═══╤══╤╮
       ╟┴┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬┴╢
       ╟┬┴─┬─┴─┬╔══════════════════╗─┴─┬─┴┬╢
       ╟┴┬─┴─┬─┴║     成 功 大 學 電 子 佈 告 欄     ║─┬─┴┬─┴╢
       ╟┬┴─┬─┴─┬╚══════════════════╝─┴─┬┴─┬╢
       ╟┴┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬┴╢
       ╟┬┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┼─┬─┴─┬─┴─┬─┴┬╢
       ╟┴╭─╮╭╮╭───╮╭─╮╭╮╭-╮╭-╮    ╭─╮╭─╮╭───╮┴╢
       ╟┬│  ╰┘││  ╭╮││  └╯││ ││ │    │  ││  ││  ╭─╯┬╢
       ╟┴│      ││  │╰╯│    ╭╯│ ╰╯ │    │  ││  ││  ╰─╮┴╢
       ╟┬│      ││  │    │    │  │      │    │  ││  ││      │┬╢
       ╟┴│      ││  │╭╮│    ╰╮│      │    │  ││  ││  ╭─╯┴╢
       ╟┬│┌╮  ││  ╰╯││  ┌╮││      │    │  ││  ││  ╰─╮┬╢
       ╟┴╰╯╰─╯╰───╯╰─╯╰╯╰───╯    ╰─╯╰─╯╰───╯┴╢
       ╟─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┼─╢
       ╟┬┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴┬╢
       ╟┴┬─┴─┬─┴─┬─┴─  資 訊 工 程 系 所   ─┬─┴─┬─┴─┬┴╢
       ╰═╧═══╧═══╧═══════════════╧═══╧═══╧═╯ [21;1H現在上線人數 [47;30m 36 [m 人
    最高上線人數 [1600]人
    請輸入代號(參觀請輸入 'guest',註冊請輸入 'new'): [7m             [m [23;49H

    註:有些東西是 BBS 用的控制碼,我沒解。

    2006年8月13日 下午 02:46
    版主
  • 請問能否提供完整的程式碼,小弟最近也是正為如何使用vb.NET寫telnet 功能,目前想要利用這個功能將部份工作,由原本人工作業方式,自動化
    2006年8月14日 上午 03:22
  • 上面的程式碼不都是原始碼嗎?

    我只有針對原討論緒做簡單的除錯測試,原討論緒貼的還更多哩~

    2006年8月14日 上午 05:46
    版主