2015/10/15

C#.Net receive and send UDP broadcast

Layout:
namespace UDP_Broadcast
{
    partial class Form1
    {
        /// <summary>
        /// 設計工具所需的變數。
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        /// 清除任何使用中的資源。
        /// </summary>
        /// <param name="disposing">如果應該處置 Managed 資源則為 true,否則為 false。</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Windows Form 設計工具產生的程式碼

        /// <summary>
        /// 此為設計工具支援所需的方法 - 請勿使用程式碼編輯器修改
        /// 這個方法的內容。
        /// </summary>
        private void InitializeComponent()
        {
            this.buttonSend = new System.Windows.Forms.Button();
            this.buttonReceive = new System.Windows.Forms.Button();
            this.textBox1 = new System.Windows.Forms.TextBox();
            this.label1 = new System.Windows.Forms.Label();
            this.SuspendLayout();
            // 
            // buttonSend
            // 
            this.buttonSend.Location = new System.Drawing.Point(12, 40);
            this.buttonSend.Name = "buttonSend";
            this.buttonSend.Size = new System.Drawing.Size(75, 23);
            this.buttonSend.TabIndex = 0;
            this.buttonSend.Text = "Send";
            this.buttonSend.UseVisualStyleBackColor = true;
            this.buttonSend.Click += new System.EventHandler(this.buttonSend_Click);
            // 
            // buttonReceive
            // 
            this.buttonReceive.Location = new System.Drawing.Point(93, 40);
            this.buttonReceive.Name = "buttonReceive";
            this.buttonReceive.Size = new System.Drawing.Size(75, 23);
            this.buttonReceive.TabIndex = 1;
            this.buttonReceive.Text = "Receive";
            this.buttonReceive.UseVisualStyleBackColor = true;
            this.buttonReceive.Click += new System.EventHandler(this.buttonReceive_Click);
            // 
            // textBox1
            // 
            this.textBox1.Location = new System.Drawing.Point(75, 12);
            this.textBox1.Name = "textBox1";
            this.textBox1.Size = new System.Drawing.Size(211, 22);
            this.textBox1.TabIndex = 2;
            // 
            // label1
            // 
            this.label1.AutoSize = true;
            this.label1.Location = new System.Drawing.Point(14, 15);
            this.label1.Name = "label1";
            this.label1.Size = new System.Drawing.Size(55, 12);
            this.label1.TabIndex = 3;
            this.label1.Text = "Send Text:";
            // 
            // Form1
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(298, 77);
            this.Controls.Add(this.label1);
            this.Controls.Add(this.textBox1);
            this.Controls.Add(this.buttonReceive);
            this.Controls.Add(this.buttonSend);
            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
            this.MaximizeBox = false;
            this.MinimizeBox = false;
            this.Name = "Form1";
            this.Text = "Form1";
            this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Form1_FormClosing);
            this.ResumeLayout(false);
            this.PerformLayout();

        }

        #endregion

        private System.Windows.Forms.Button buttonSend;
        private System.Windows.Forms.Button buttonReceive;
        private System.Windows.Forms.TextBox textBox1;
        private System.Windows.Forms.Label label1;
    }
}




Code:
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Windows.Forms;

namespace UDP_Broadcast
{
    public partial class Form1 : Form
    {
        /// <summary>
        /// Port
        /// </summary>
        private const int PORT = 12345;

        /// <summary>
        /// 訊息
        /// </summary>
        private String msg
        {
            get { return String.IsNullOrEmpty(textBox1.Text) ? "Hi, C.Y. Fang" : textBox1.Text; }
        }

        /// <summary>
        /// 接收 UDP
        /// </summary>
        private readonly UdpClient receive = new UdpClient(PORT);

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            receive.Close();
        }

        /// <summary>
        /// 送出訊息的按鈕
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonSend_Click(object sender, EventArgs e)
        {
            SendMessage();
        }

        /// <summary>
        /// 接收廣播的按鈕
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonReceive_Click(object sender, EventArgs e)
        {
            ReceiveBroadcast();
        }

        private void SendMessage()
        {
            //UDP
            UdpClient client = new UdpClient();

            //Address
            IPEndPoint ip = new IPEndPoint(IPAddress.Broadcast, PORT);

            //Message
            byte[] data = Encoding.UTF8.GetBytes(msg);

            //Send Message
            client.Send(data, data.Length, ip);
            client.Close();
        }

        private void ReceiveBroadcast()
        {
            Console.WriteLine("Server started");

            try
            {
                //開始接收
                receive.BeginReceive(ReceiveCallBack, null);
            }
            catch (SocketException ex)
            {
                Console.WriteLine(String.Format("ErrorCode:{0}, ErrorMessage:{1}", ex.ErrorCode, ex.Message));
            }
        }

        private void ReceiveCallBack(IAsyncResult ar)
        {
            //IP
            IPEndPoint ip = new IPEndPoint(IPAddress.Any, PORT);

            //收資料
            byte[] data = receive.EndReceive(ar, ref ip);

            //UTF8編碼
            String text = Encoding.UTF8.GetString(data);

            //印出接收到的訊息
            Console.WriteLine(String.Format("IP Address{0}, Message:{1}", ip.Address, text));

            //持續接收
            ReceiveBroadcast();
        }

    }
}


執行結果: