none
TCP/IP通信を行いたい RRS feed

  • 質問

  • VS2012  VB  windows8.1

    TCP/IP通信において

    コマンドプロンプトを立ち上げて

    telnet 192.168.254.254  9999

    と入力し、ある電化製品に接続し、

    ”K”という英字を入力すると生データ(英数字)が返ってきます。この

    返ってくる英数字をVS2012の下記に示すコードによってtextbox2へ代入しようとしていますが上手くいきません。下記のコードをどのように変えればコマンドプロンプトみたいなことができるのでしょうか?

     Dim port As Int32 = 9999
            Dim client As New TcpClient("192.168.254.254", port)

            ' Translate the passed message into ASCII and store it as a Byte array.
            Dim data As [Byte]() = System.Text.Encoding.ASCII.GetBytes("K")

            ' Get a client stream for reading and writing.
            '  Stream stream = client.GetStream();
            Dim stream As NetworkStream = client.GetStream()

            ' Send the message to the connected TcpServer.
            stream.Write(data, 0, data.Length)

            Console.WriteLine("Sent: {0}", "K")

            ' Receive the TcpServer.response.
            ' Buffer to store the response bytes.
            data = New [Byte](256) {}

            ' String to store the response ASCII representation.
            Dim responseData As [String] = [String].Empty

            ' Read the first batch of the TcpServer response bytes.
            Dim bytes As Int32 = stream.Read(data, 0, data.Length)
            responseData = System.Text.Encoding.ASCII.GetString(data, 0, bytes)
            Console.WriteLine("Received: {0}", responseData)

            TextBox2.Text = responseData


            ' Close everything.
            stream.Close()
            client.Close()



            Console.WriteLine(ControlChars.Cr + " Press Enter to continue...")
            Console.Read()




    • 編集済み kirua777 2014年7月29日 13:51
    2014年7月29日 4:58

回答

  • kirua777 さま よろしく。

    Hongliang さまのご回答に補足。
    以下のコードを入れて、直後にブレークポイントを入れてデバッグして見て下さい。
    上の一行目は kirua777 さまの元々の文で 5文字(間違い)、次の2行は同じ答えの筈です。

    Dim data As [Byte]() = System.Text.Encoding.ASCII.GetBytes("K" + "CR" + "LF")  ' 5 文字になってますよ!
    Dim data2 As [Byte]() = System.Text.Encoding.ASCII.GetBytes("K" + vbCr + vbLf)
    Dim data3 As [Byte]() = System.Text.Encoding.ASCII.GetBytes(Chr(75) + Chr(13) + Chr(10))  '関数電卓で 16進 4b, 0d, 0a を各々 10進へ

    • 編集済み ShiroYuki_Mot 2014年7月30日 1:39 上の一行 の行を編集 と誤字訂正
    • 回答としてマーク kirua777 2014年7月30日 6:53
    2014年7月30日 1:34

すべての返信

  • 「上手くいきません」ではわかりません。技術系メーリングリストで質問するときのパターン・ランゲージなどを参考に結果の予想と実際の結果を提示すべきかと。

    telnetで入力したのは本当に「K」1文字なのですか?

    2014年7月29日 21:59
  • こちらも同じ質問でしょうか。
    個人的には同じ質問を複数のサイトに分散することはやめた方がよいと思っています。
    回答しよう、助言しようと考えている人々の時間を無駄にする可能性があるためです。
    (一方のサイトで解決しているのに、他方のサイトに報告がなくて回答者が時間を使ってしまうとか、一方のサイトで否定した内容が他方のサイトで同じ内容が寄せられるとか)

    さて、私も佐祐理さんと似たポイントで気になっているのは、本当に "K" 1 文字だったのか、改行はないのか? というところです。
    あとは 1 回の Read で想定した分量を得られないのなら繰り返し読むコードを入れないとだめかもしれませんね。

    2014年7月29日 22:16
    モデレータ
  • 大変失礼しました。今後、他のサイトでの質問は控えます。

    すみません要求コマンドの仕様書には画像に示す内容なのですが?

    Kで要求するのは間違っていますか?

    2014年7月30日 0:28
  • KだけじゃなくてCR(\xd)とLF(\xa)もよこせとはっきり書かれていますが……。
    2014年7月30日 0:35
  • すみません。

    コードを書き直すなら

    Dim data As [Byte]() = System.Text.Encoding.ASCII.GetBytes("K"+"CR"+"LF")

    で宜しいでしょうか? もしくはDim data As [Byte]() = System.Text.Encoding.ASCII.GetBytes("K" & CR & LF)

    ”” はいらなく &なのでしょうか?


    • 編集済み kirua777 2014年7月30日 1:00
    2014年7月30日 1:00
  • CRやLFは、CRやLFという"文字列"ではなく、行頭復帰・改行を表す"文字"です。ASCIIコードでそれぞれ&H0Dと&H0Aに当たります。

    VBで書くならCHR(&HD)とか、あるいは組み込みの定数vbCr、vbLfを使用します。

    それから、向こうから返ってくるデータも、STX(これもテキスト開始を表す"文字"です)など、単にまとめて文字列変換するだけではうまくいきません。1バイトずつ確認していってください。
    • 編集済み Hongliang 2014年7月30日 1:14
    2014年7月30日 1:12
  • kirua777 さま よろしく。

    Hongliang さまのご回答に補足。
    以下のコードを入れて、直後にブレークポイントを入れてデバッグして見て下さい。
    上の一行目は kirua777 さまの元々の文で 5文字(間違い)、次の2行は同じ答えの筈です。

    Dim data As [Byte]() = System.Text.Encoding.ASCII.GetBytes("K" + "CR" + "LF")  ' 5 文字になってますよ!
    Dim data2 As [Byte]() = System.Text.Encoding.ASCII.GetBytes("K" + vbCr + vbLf)
    Dim data3 As [Byte]() = System.Text.Encoding.ASCII.GetBytes(Chr(75) + Chr(13) + Chr(10))  '関数電卓で 16進 4b, 0d, 0a を各々 10進へ

    • 編集済み ShiroYuki_Mot 2014年7月30日 1:39 上の一行 の行を編集 と誤字訂正
    • 回答としてマーク kirua777 2014年7月30日 6:53
    2014年7月30日 1:34