블로그 이미지
따시쿵

calendar

1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

Notice

2015. 2. 25. 17:31 C# with UDP/IP

브로드캐스트는 같은 물리적 네트워크 상에 있는 받을 준비가 되어 있는 모든 컴퓨터에게 메시지를 전송하는 기법입니다. 기본적으로 라우터나 게이트웨이는 BROADCAST 메시지를 전달하지 않습니다.


브로드캐스트의 또 다른 제약사항은 인터페이스의 최대 전송 단위(maximum transmission unit, MTU)를 넘지 않는다는 겁니다. 기본적으로 브로드캐스트 패킷은 최대 전송 단위를 초과할 수 없습니다.

예를 들어 1460 (1500 - 20 (IP Header) - 20 (UDP Header)) 과 같습니다.


브로드캐스트 주소는 255.255.255.255 이거나 network broadcast address 입니다.

(예전의 브로드캐스트 주소인 0.0.0.0 은 현재는 네트워크 주소로 사용되고 있습니다.

예를 들어, 당신의 컴퓨터 주소가 192.168.20.0 이고 넷마스크가 255.255.255.0 이라면, 브로드캐스트 주소는 192.168.20.255 입니다. (192.168.20.0 might work for backward compatibility) 


당신의 IP address, netmask를 알고 있다면 다음의 공식을 이용해서 산출할 수 있습니다.

Your Broadcast address is: < IP Address > | ( ˜ Netmask ) 


이론적으로 브로드캐스트에 대한 이해를 돕기 위해서는 아래의 사이트를 참조하시기 바랍니다.

Internetwork Design Guide -- UDP Broadcast Flooding

Broadcasting and Multicasting

UDP 통신 시 브로드캐스트 IP 셋팅하기



브로드캐스트시 IP 셋팅 방법은 아래와 같습니다.


IP 주소의 서브넷 부분을 제외한 호스트 자리를 2진수 1로 채운 것을 말합니다.


1.

제품의 IP주소가 공장 초기 값인 10.1.0.1 이고 서브넷 마스크가 255.0.0.0 이라고 한다면,

네트워크 자리는 10. 까지이며 호스트 주소가 1.0.1 이 부분이 서브넷 마스크가 0.0.0 이기 때문에 

그 부분의 2진수를 1로 다 채우게 되면 10.255.255.255가 되겠습니다.

http://blog.sollae.co.kr/?p=691


2.

제품 IP주소가 192.168.0.100 이고, 서브넷 마스크가 255.255.255.0인 경우는 브로드캐스트 IP가 무엇이 될까요

바로 192.168.0.255입니다. 서브넷 마스크가 나타내는 네트워크 자리는 192.168.0.이며 호스트 자리는 100입니다.

호스트자리를 전체 1로 다 채우면 255가 되겠습니다.

http://blog.sollae.co.kr/?p=691


3.

172 대역을 살펴보겠습니다.

제품 IP주소가 172.16.0.100 이고 서브넷 마스크가 255.255.254.0인 경우의 브로드캐스트 IP는 바로 172.16.1.255입니다.

http://blog.sollae.co.kr/?p=691


4.

ip 주소가 255.255.255.255 를 사용합니다. 같은 물리적 네트워크상의 모든 컴퓨터에게 메시지를 전송합니다.

http://www.tack.ch/multicast/broadcast.shtml



프로그램 설명


sender 가 UdpClient 를 생성하여 broadcast IP 인 255.255.255.255 주소로 메시지를 전송하고, receiver 에서는 메시지 받는 루틴을 만들어서 sender 가 전송한 메시지를 받아서 화면에 보여 줍니다.



실행 후






메시지 전송 후






프로그램 작성 순서


1. sender 프로그램


UDPer class define

    class UDPer
    {
        private const int PORT_NUMBER = 15000;

        public void Send(string message)
        {
            UdpClient client = new UdpClient();
            IPEndPoint ip = new IPEndPoint(IPAddress.Parse("255.255.255.255"), PORT_NUMBER);
            client.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
            byte[] bytes = Encoding.UTF8.GetBytes(message);
            client.Send(bytes, bytes.Length, ip);
            client.Close();

            if (OnSendMessage != null)
                OnSendMessage(message);
        }

        public delegate void SendMessageHandler(string message);
        public event SendMessageHandler OnSendMessage;
    }


Windows Form define

        UDPer udper = null;
        public SendForm()
        {
            InitializeComponent();

            udper = new UDPer();
            udper.OnSendMessage += new UDPer.SendMessageHandler(udper_OnSendMessage);
        }

        void udper_OnSendMessage(string message)
        {
            Trace.WriteLine(string.Format("sent messge : {0}", message));
            lblResult.Text = message;
        }

        private void button1_Click(object sender, EventArgs e)
        {            
            udper.Send(textBox1.Text);
        }


2. receiver 프로그램


UDPer class define

    class UDPer
    {
        private const int PORT_NUMBER = 15000;

        private UdpClient udp = null;
        IAsyncResult ar_ = null;
        
        public void Start()
        {
            if (udp != null)
            {
                throw new Exception("Alread started, stop first");                
            }

            udp = new UdpClient();

            IPEndPoint localEp = new IPEndPoint(IPAddress.Any, PORT_NUMBER);

            udp.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
            udp.ExclusiveAddressUse = false;
            udp.Client.Bind(localEp);

            StartListening();
        }

        public void Stop()
        {
            try
            {
                if (udp != null)
                {
                    udp.Close();
                    udp = null;
                }
            }
            catch { }
        }

        private void StartListening()
        {
            ar_ = udp.BeginReceive(Receive, new object());
        }

        private void Receive(IAsyncResult ar)
        {
            try
            { 
                if (udp != null)
                { 
                    IPEndPoint ip = new IPEndPoint(IPAddress.Any, PORT_NUMBER);
                    byte[] bytes = udp.EndReceive(ar, ref ip);
                    string message = Encoding.UTF8.GetString(bytes);
                    StartListening();

                    if (OnReceiveMessage != null)
                        OnReceiveMessage(message);
                }
            }
            catch(SocketException se)
            {
                Trace.WriteLine(string.Format("SocketException : {0}", se.Message));
            }
            catch(Exception ex)
            {
                Trace.WriteLine(string.Format("Exception : {0}", ex.Message));
            }
        }

        public delegate void ReceiveMessageHandler(string message);
        public event ReceiveMessageHandler OnReceiveMessage;

    }


Windows Form define

        UDPer udper = null;
        bool isBtnCommandEnabled = true;
        public ReceiveForm()
        {
            InitializeComponent();

            udper = new UDPer();
            udper.OnReceiveMessage += new UDPer.ReceiveMessageHandler(udper_OnReceiveMessage);

        }

        protected override void OnClosed(EventArgs e)
        {
            if (udper != null)
                udper.Stop();

            base.OnClosed(e);
        }

        void udper_OnReceiveMessage(string message)
        {
            Trace.WriteLine(string.Format("received message : {0}", message));
            Invoke((MethodInvoker)delegate
            {
                lblReceive.Text = message;
            });
        }

        private void btnCommand_Click(object sender, EventArgs e)
        {
            if (isBtnCommandEnabled)
            { 
                udper.Start();
                UpdateUI(isBtnCommandEnabled);
                isBtnCommandEnabled = false;                
            }
            else
            {
                udper.Stop();                
                UpdateUI(isBtnCommandEnabled);
                isBtnCommandEnabled = true;
            }
        }

        private void UpdateUI(bool isBool)
        {
            if (isBool)
            {
                this.btnCommand.Text = "Stop the UDP Client";
                this.btnCommand.ForeColor = Color.White;
                this.btnCommand.BackColor = Color.Orange;
            }
            else
            {
                this.btnCommand.Text = "Stop the UDP Client";
                this.btnCommand.ForeColor = SystemColors.ControlText;
                this.btnCommand.BackColor = SystemColors.Control;
            }
        }

        private void btnClose_Click(object sender, EventArgs e)
        {
            if (udper != null)
                udper.Stop();

            this.Close();
        }


posted by 따시쿵