UDP送受信スレッド

Namespace: FVIL.Net
Assembly: FVILforms (in FVILforms.dll) Version: 3.1.0.0 (3.1.0.9)

Syntax

C#
public class UdpClientThread : IDisposable
Visual Basic
Public Class UdpClientThread
	Implements IDisposable

Remarks

接続先にデータを送信するには以下のいずれかのメソッドを使用してください。
  1. Send
  2. SendAsXml
  3. SendAsBinary (推奨)

接続先からデータを受信するにはスレッドを使用してください。 受信スレッドがデータを受信したことを検知するには Wait で待機するか、Notify イベントを使用してください。 データを受信するとスレッドがイベントを通知しますので、 受け取ったイベントの引数(TcpClientEventArgs)の Data プロパティからデータを復元してください。 復元方法は、送信元が使用したメソッドによって異なります。
  1. Send ... Marshal.PtrToStructure 等で復元してください。
  2. SendAsXml ... ReadAsXml で復元してください。
  3. SendAsBinary ... ReadAsBinary で復元してください。

SendAsXml や SendAsBinary は大量のデータの伝送には対応していません。 1つのパケットが 32kbytes を超える場合は Send メソッドを使用して 自身で送受信のハンドシェイクを行ってください。

Examples


送信側の例を示します。
192.168.1.200, 50000 は送信先の IP アドレスとポート番号を示します。 この例では受信処理を行っていませんが、自身の受信ポートは送信先と同一番号(50000)をオープンしています。

C# Copy imageCopy
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace TestUDP
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (UdpClientThread != null)
                UdpClientThread.Dispose();
        }

        /// <summary>
        /// UDP通信スレッド
        /// </summary>
        FVIL.Net.UdpClientThread UdpClientThread = null;

        /// <summary>
        /// オープン
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Open_Click(object sender, EventArgs e)
        {
            FVIL.Net.IPInfo info = new FVIL.Net.IPInfo("192.168.1.200", 50000, "client200");
            UdpClientThread = new FVIL.Net.UdpClientThread(info);
            UdpClientThread.Start();
        }

        /// <summary>
        /// 送信1
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Send_Click(object sender, EventArgs e)
        {
            UdpClientThread.SendAsBinary(new FVIL.Data.CFviPoint(111.1, 222.2));
        }

        /// <summary>
        /// 送信2
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Send_Click(object sender, EventArgs e)
        {
            UdpClientThread.SendAsBinary("Hello, world!");
        }
    }
}


受信側の例を示します。
この場合は送信先がないので自身の IP アドレスを指定してかまいません。 但し、ポート番号は適切なものを指定してください。 前述の送信側のデータを受信する場合は、ポート番号 50000 をオープンしなければなりません。

C# Copy imageCopy
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace TestUDP
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }

        private void Form2_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (UdpClientThread != null)
                UdpClientThread.Dispose();
        }

        /// <summary>
        /// UDP通信スレッド
        /// </summary>
        FVIL.Net.UdpClientThread UdpClientThread = null;

        /// <summary>
        /// オープン
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Open_Click(object sender, EventArgs e)
        {
            FVIL.Net.IPInfo info = new FVIL.Net.IPInfo("192.168.1.200", 50000, "client200");
            UdpClientThread = new FVIL.Net.UdpClientThread(info);
            UdpClientThread.Notify += new FVIL.Net.UdpClientEventHandler(UdpClientThread_Notify);
            UdpClientThread.Start();
        }

        /// <summary>
        /// 受信イベント
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void UdpClientThread_Notify(object sender, FVIL.Net.UdpClientEventArgs e)
        {
            Console.WriteLine("TimeStamp = {0}", e.TimeStamp);
            Console.WriteLine("Exception = {0}", e.Exception);
            Console.WriteLine("RemoteEP = {0},{1}", e.RemoteEP.Address, e.RemoteEP.Port);
            if (e.Data != null)
            {
                object _data = UdpClientThread.ReadAsBinary(e.Data);

                if (_data is FVIL.Data.CFviPoint)
                {
                    FVIL.Data.CFviPoint data = (FVIL.Data.CFviPoint)_data;
                    Console.WriteLine("data = {0},{1}", data.X, data.Y);
                }
                else if (_data is string)
                {
                    string data = (string)_data;
                    Console.WriteLine("data = {0}", data);
                }
            }
        }
    }
}

出力結果:
TimeStamp = 2012/05/31 19:40:59
Exception = 
RemoteEP = 172.17.13.107,50000
data = 111.1, 222.2
TimeStamp = 2012/05/31 19:40:59
Exception = 
RemoteEP = 172.17.13.107,50000
data = Hello, world!

Inheritance Hierarchy

System..::..Object
FVIL.Net..::..UdpClientThread

See Also