質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.12%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

TCP

TCP(Transmission Control Protocol)とは、トランスポート層のプロトコルで、コネクション型のデータサービスです。

デバッグ

デバッグはプログラムのバグや欠陥を検知し、開発中のバグを取り除く為のプロセスを指します。

解決済

C# TCP/IP送受信が正しくできてるかのデバッグ方法を教えて下さい。

changryu
changryu

総合スコア1

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

TCP

TCP(Transmission Control Protocol)とは、トランスポート層のプロトコルで、コネクション型のデータサービスです。

デバッグ

デバッグはプログラムのバグや欠陥を検知し、開発中のバグを取り除く為のプロセスを指します。

3回答

1リアクション

0クリップ

760閲覧

投稿2022/09/07 07:49

前提

先週金曜日に突如業務でプログラムを作ることになった初心者です。
学生時代にプログラミングに挫折した経験から、ど初心者の自分がすぐに作れるほど甘くないことは理解しているつもりですが、それでも社内メンバーで一番PCに詳しいというだけで白羽の矢が立った次第です。
使用する言語は何でも良いとの事だったので、これを機会に将来的に社内ツールなども作れるようになったら良いなと思いC#を使うことにしました。
週末に参考書を買い、Microsoft Visual Studio Community 2022をインストールしいざプログラム作成を開始しました。
この三日間ググりながら少しづつトライ&エラーをしてきましたが、「15分調べてもわからないことは、teratailで質問しよう ...」というのが目に入り、こちらで質問させて頂くことにしました。
諸先輩方、分からないことが分からず質問も変な初心者ですが、どうぞ宜しくお願い致します。

実現したいこと

キーエンスのレーザーマーカーをWindowsPCからTCP/IP通信を使って制御したいです。

そこでまずはTCP/IP通信を行えるフリーソフトを使って制御できるかをテストしました。
使用したフリーソフトはNonSoft様(http://nonsoft.la.coocan.jp/ )が公開しているTCP/IPテストツールを使わせて頂きました。

イメージ説明

キーエンスのマニュアルを片手にTCP/IPにて問題なく制御できることが確認できました。
こちらのツールをこのまま使わせて頂くことも方法の一つだとは思うのですが(業務で使う為NonSoft様への交渉は必要かと思いますが)、最終的には自分でレーザーマーカー制御に特化したソフトを作りたいと考えています。

発生している問題・エラーメッセージ

先にお見せしたTCP/IPツールのようにコマンドを送信(送->)をすると、即座にレスポンス(->受信)が返ってくることが分かっています。
私の作ったプログラムで同じコマンドを送信しても、受信が返ってこずタイムアウトしている”よう”です。

イメージ説明

タイムアウトしている”よう”と書かせて頂いたのも、接続はできているようなのですが、正しくコマンドが送信できているか?または正しく受信ができているのかが分からない為です。

もし正しくコマンドが送信できているということや、そもそもプログラムが間違っており受信にすら至っていないなどデバッグ方法があればご教授頂けないかと思い、こちらに記載させて頂きました。

該当のソースコード

基本的に、育児パパの人生備忘録様(https://t19488sns.com/socket/370/ )と dobon.net様(https://dobon.net/ )を参考にさせて頂いています。

Formに受信した内容をListBoxに表示しようと考えていますが、まだ実装できていません。

イメージ説明

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Net.Sockets; using System.Net.NetworkInformation; using System.IO; namespace TCP_Client { public partial class Form1 : Form { public Form1() { InitializeComponent(); } TcpClient tcp; //定義 private void btnSend_Click(object sender, EventArgs e) { try { string tmp; int hoge; Get_TCPServer(out tmp, out hoge); //オープン //OpenTcpClient(tmp, hoge); tcp = new TcpClient(tmp, hoge); //送受信 //NetworkStreamを取得する NetworkStream ns = tcp.GetStream(); //読み取り、書き込みのタイムアウトを10秒にする //デフォルトはInfiniteでタイムアウトしない //(.NET Framework 2.0以上が必要) ns.ReadTimeout = 1000; ns.WriteTimeout = 1000; //サーバーにデータを送信する //文字列はByte型配列に変換 Encoding enc = Encoding.UTF8; //byte[] sendBytes = enc.GetBytes(tmp + '\n'); byte[] sendBytes = enc.GetBytes(tmp); //データを送信する ns.Write(sendBytes, 0, sendBytes.Length); //サーバーから送られたデータを受信する MemoryStream ms = new MemoryStream(); byte[] resBytes = new byte[256]; int resSize = 0; do { //データの一部を受信する resSize = ns.Read(resBytes, 0, resBytes.Length); //Readが0を返した時はサーバーが切断したと判断 if (resSize == 0) { Console.WriteLine("サーバーが切断しました。"); break; } //受信したデータを蓄積する ms.Write(resBytes, 0, resSize); //まだ読み取れるデータがあるか、データの最後が\nでない時は、 //受信を続ける } while (ns.DataAvailable || resBytes[resSize - 1] != '\n'); //受信したデータを文字列に変換 string resMsg = enc.GetString(ms.GetBuffer(), 0, (int)ms.Length); ms.Close(); //末尾の\nを削除 resMsg = resMsg.TrimEnd('\n'); //閉じる ns.Close(); tcp.Close(); } catch(Exception ex) { MessageBox.Show(ex.Message, "エラー発生"); } } private void Get_TCPServer(out string ipadd, out int port) { port = (int)nudport.Value; //ポートは簡単 ipadd = ""; //IPの取得(IPパラメータ4つ分取得) for (int n = 0; n < 4; n++) { //コントロール名から設定を取得 NumericUpDown nud = (NumericUpDown)this.Controls["nudIP" + (n + 1).ToString()]; if (nud == null) { MessageBox.Show("こんとろーる取得失敗"); return; } //最初だけカンマ無し ipadd += (n == 0) ? nud.Value.ToString() : "." + nud.Value.ToString(); } } private bool Send_Ping(string ip) { //Pingのインスタンス生成 Ping sender = new Ping(); //ping送信 PingReply reply = sender.Send(ip, 10000); return (reply.Status == IPStatus.Success) ? true : false; } private void btnCheck_Click(object sender, EventArgs e) { //検索するIPアドレスを取得する string tmp; int hoge; Get_TCPServer(out tmp, out hoge); //pingの送信 bool res = Send_Ping(tmp); //結果に応じて、表示の変更 string mes = (res == true) ? "存在確認OK" : "接続不可"; MessageBox.Show(mes); } } }

試したこと

送受信時のタイムアウトの時間を延ばすことや、受信メッセージの改行コード\nを取ってみたり。
これ以上何をすれば良いか分からずいます・・・m(_ _)m

補足情報(FW/ツールのバージョンなど)

Microsoft Visual Studio Community 2022
Version 17.2.4
VisualStudio.17.Release/17.2.4+32602.215
Microsoft .NET Framework
Version 4.8.04084

インストールされているバージョン:Community

ASP.NET and Web Tools 2019 17.2.392.13739
ASP.NET and Web Tools 2019

Azure App Service Tools v3.0.0 17.2.392.13739
Azure App Service Tools v3.0.0

C# ツール 4.2.0-4.22281.5+8d3180e5f00d42f0f0295165f756f368f0cbfa44
IDE で使用する C# コンポーネント。プロジェクトの種類や設定に応じて、異なるバージョンのコンパイラを使用できます。

Common Azure Tools 1.10
Provides common services for use by Azure Mobile Services and Microsoft Azure Tools.

Microsoft JVM Debugger 1.0
Provides support for connecting the Visual Studio debugger to JDWP compatible Java Virtual Machines

NuGet パッケージ マネージャー 6.2.1
Visual Studio 内の NuGet パッケージ マネージャー。NuGet の詳細については、https://docs.nuget.org/ にアクセスしてください

TypeScript Tools 17.0.10418.2001
TypeScript Tools for Microsoft Visual Studio

Visual Basic ツール 4.2.0-4.22281.5+8d3180e5f00d42f0f0295165f756f368f0cbfa44
IDE で使用する Visual Basic コンポーネント。プロジェクトの種類や設定に応じて、異なるバージョンのコンパイラを使用できます。

Visual F# Tools 17.1.0-beta.22274.4+211fd760c2315d73cfa0d375fe64abb346bc1096
Microsoft Visual F# Tools

Visual Studio IntelliCode 2.2
Visual Studio 向けの AI 支援付き開発。

TN8001👍を押しています

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

dodox86

2022/09/07 12:32

基本的には既にいただいている複数の回答のようにクライアントアプリ側でまず送受信データが正しいかどうか確認してから実機に接続して確認をすべきですが、キーエンスのレーザーマーカー自体に送受信データのログ保存機能があったりするので、レーザーマーカーとそのサポートソフトの機能をマニュアルで確認すると良いです。質問者さんがお使いの機種でそういったものがあるかは分かりかねますが、実機での問題の確認に役に立ちます。

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.12%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

TCP

TCP(Transmission Control Protocol)とは、トランスポート層のプロトコルで、コネクション型のデータサービスです。

デバッグ

デバッグはプログラムのバグや欠陥を検知し、開発中のバグを取り除く為のプロセスを指します。