前提
先週金曜日に突如業務でプログラムを作ることになった初心者です。
学生時代にプログラミングに挫折した経験から、ど初心者の自分がすぐに作れるほど甘くないことは理解しているつもりですが、それでも社内メンバーで一番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 支援付き開発。

回答3件
あなたの回答
tips
プレビュー