前提・実現したいこと
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
回答2件
あなたの回答
tips
プレビュー