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

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

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

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

TCP

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

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

Q&A

解決済

2回答

2593閲覧

C# TCP通信プログラム 処理時間の計測方法

Teagle333

総合スコア15

C#

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

TCP

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

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

0グッド

0クリップ

投稿2021/04/25 14:28

前提・実現したいこと

TCPでデータの送受信を行うプログラムを作っています。
クライアント側でメッセージを送信すると、サーバ側でそれを受けと取り、そのままクライアントに返します。
ここで、データを送信してから、そのデータがこちらに返ってくるまでの時間を測定できるようにしたいと考えています。

以下のコードは、クライアント側のデータ送受信プログラムです。
このコードだと、メッセージの送信開始から、サーバからのデータの受信完了までの間を、StopWatchで計測しています。
しかしこの方法だと、timer1_Tickのインターバル時間が重なり、正確な処理時間が計測できません。

正確にデータの送受信時間を計測するにはどうすればよいでしょうか。

該当のソースコード

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.Diagnostics; using System.Threading; using System.Net; delegate void delTest(string data); namespace WindowsFormsApplication1 { public partial class Form1 : Form { // ソケット生成 private System.Net.Sockets.TcpClient tcp; private System.Net.Sockets.NetworkStream ns; // ソケット・リスナー private System.Net.Sockets.TcpListener myListener; // クライアント送受信 private ClientTcpIp[] myClient = new ClientTcpIp[4]; public static Stopwatch sWatch = new Stopwatch(); public Form1() { InitializeComponent(); }      // ソケット接続 private void btn1_Click(object sender, EventArgs e) { try { string ipAddress = "192.168.1.201"; int port = 5956; // ソケット接続 if (tcp == null) { tcp = new System.Net.Sockets.TcpClient(ipAddress, port); } // ソケットストリーム取得 ns = tcp.GetStream(); //sWatch.Stop(); timer1.Start(); //ログに出力 listBox1.Items.Add("サーバーに接続しました。"); } catch (Exception ex) { listBox1.Items.Add(ex); } }      // ソケット切断 private void btn2_Click(object sender, EventArgs e) { timer1.Stop(); // ソケットクローズ ns.Close(); ns.Dispose(); ns = null; tcp.Close(); tcp.Dispose(); tcp = null; //ログに出力 listBox1.Items.Add("サーバーから切断しました。"); }      // メッセージ送信 private void btn3_Click(object sender, EventArgs e) { // ソケット送信 Byte[] dat = System.Text.Encoding.GetEncoding("SHIFT-JIS").GetBytes(textBox1.Text); sWatch.Reset(); sWatch.Start(); ns.Write(dat, 0, dat.GetLength(0)); //ログに出力 listBox1.Items.Add("ソケットを送信しました。"); }      // メッセージ受信 private void timer1_Tick(object sender, EventArgs e) { //ソケット受信 if (tcp.Available > 0) { Byte[] dat = new Byte[tcp.Available]; ns.Read(dat, 0, dat.GetLength(0)); sWatch.Stop(); //ログに出力 listBox1.Items.Add("ソケットを受信しました。"); listBox1.Items.Add(System.Text.Encoding.GetEncoding("SHIFT-JIS").GetString(dat)); listBox1.Items.Add("処理時間: " + sWatch.Elapsed); } }

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

・OS:Windows10
・ツール:Visual Studio 2013

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YAmaGNZ

2021/04/25 22:40

「正確な処理時間」というのが何の時間なのかによるのではないでしょうか まずは何を計りたいのか明確にする必要があるかと思います。 また計った時間を何に使うのかにもよるのではないですかね。 プログラムが送信した時間~プログラムが受信した時間というのであれば現状でいいのではないでしょうか。 もしパケット受信時間とプログラム上のデータ受信時間の差を小さくするというのであれば非同期処理を利用する構造に変更するしかないでしょう。
Teagle333

2021/04/27 09:13

他の回答者様がおっしゃる通り、非同期処理の構造に作り替えようと思います。 貴重なご意見、ありがとうございました。
guest

回答2

0

こういう時間計測はタイマを使うんじゃなくて、それぞれのポイントで現在時を取得してその時間差を算出するようにします

c# — マイクロ秒単位のC#時間

投稿2021/04/25 22:06

y_waiwai

総合スコア88042

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Teagle333

2021/04/27 09:17

ご回答ありがとうございます。タイマ以外の時間計測で試してみたいと思います。
guest

0

ベストアンサー

timer1_Tickメソッドは、System.Windows.Forms.Timerの Tickイベントハンドラ でしょうかね。
ドキュメントにあるように、精度は 55ミリ秒が限度のようです。

https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.forms.timer?view=netframework-4.5

Windows フォーム Timer コンポーネントはシングルスレッドであり、55ミリ秒の精度に制限されています。

送信と受信の処理は、別スレッドにでもすればよいかと思います。

TcpClientクラスを非同期処理している例がありましたので参考までに
【c#.net】asyn/awaitについてTcpClientクラスを使って非同期処理を検証する

投稿2021/04/26 01:33

satokei

総合スコア1217

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Teagle333

2021/04/27 09:15

ご回答いただき、ありがとうございます。 今のままだと難しそうなので、ご回答にある通り、非同期処理の構造に作り替えようかと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問