3流プログラマのメモ書き

元開発職→社内SE→派遣で営業支援の三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。(jehupc.exblog.jpから移転中)

(.Net)UDPの送受信テストツール

連続したUDPパケットが送信側と受信側でちゃんとやり取りされているかを確認したいと思ってツールを探してみたんですが、いいものが無かったのでちょっと.Net Framework で自作してみました。

とりあえず急ぎでパケットの送受信さえ確認できればいいというものなので、作りは非常に雑です。

しかし、こんなに簡単にネットワーク通信アプリが作れる .Net というフレームワークはやはり評価すべきだなと思いました。

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

 

namespace UDPtest

{

public partial class Form1 : Form

{

private int iCnt = 10000;

private bool flgStop = true;

 

public Form1()

{

InitializeComponent();

}

 

private void button1_Click(object sender, EventArgs e)

{

richTextBox1.Clear();

 

//文字コードを指定する

System.Text.Encoding enc = System.Text.Encoding.UTF8;

 

//データを送信するリモートホストとポート番号

string remoteHost = "192.168.0.100";

int remotePort = 55001;

//バインドするローカルポート番号

int localPort = 55000;

 

//ローカルポート番号localPortにバインドする

System.Net.Sockets.UdpClient udp =

new System.Net.Sockets.UdpClient(localPort);

 

int imtu = 10000;

 

for (int i = 0; i < iCnt; i++)

{

StringBuilder strMsg = new StringBuilder();

strMsg.Append(i.ToString("000000000"));

richTextBox1.AppendText(strMsg.ToString() + Environment.NewLine);

for (int j = 0; j < 1000; j++)

{

strMsg.Append("a");

}

 

byte[] sendBytes = enc.GetBytes(strMsg.ToString());

udp.Send(sendBytes, sendBytes.Length, remoteHost, remotePort);

//System.Threading.Thread.Sleep(1);

 

}

//UDP接続を終了

udp.Close();

Console.ReadLine();

}

 

private void button2_Click(object sender, EventArgs e)

{

richTextBox1.Clear();

//文字コードを指定する

System.Text.Encoding enc = System.Text.Encoding.UTF8;

 

//バインドするローカルポート番号

int localPort = 55001;

 

//ローカルポート番号localPortにバインドする

System.Net.Sockets.UdpClient udp =

new System.Net.Sockets.UdpClient(localPort);

 

for (int i = 0; i < iCnt - 1; i++)

{

//データを受信する

System.Net.IPEndPoint remoteEP = null;

byte[] rcvBytes = udp.Receive(ref remoteEP);

string rcvMsg = enc.GetString(rcvBytes);

rcvMsg = rcvMsg.Substring(0, 9);

 

System.IO.File.AppendAllText("res.txt", rcvMsg + Environment.NewLine);

}

udp.Close();

}

}

}

送信側で Thread.Sleep をしないと、結構な数のパケットが受信側に届きませんでした。

逆に Thread.Sleep(1) とすると、ほとんどのパケットが受信側に届きました。

どこでパケットロスしているのかがわかるといいんですが。。。。

参考:

dobon:UDPによりデータの送受信を行う