블로그 이미지
따시쿵

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

2014. 12. 23. 11:51 C# with TCP/IP

프로그램 설명


클라이언트가 연결을 끊을 시에 서버에서 인지를 하고 서버 프로그램도 같이 종료되는 프로그램입니다. 

윈도우 폼 형식으로 작성을 했으며, 실제 테스트를 하기 위해서는 클라이언트 프로그램을 실행하고 메시지를 주고 받은 후, 팝업 창의 X 버튼을 눌러서 프로그램을 종료하는 것으로 합니다.


확인을 위해서 각 단계별로 메시지를 보여 주었습니다.


실행 후





메시지 전송 후





프로그램 작성 순서


1. 소켓/쓰레드과 관련한 네임스페이스를 서버/클라이언트 모두에 포함 시킵니다.

using System.Net;
using System.Net.Sockets;
using System.Threading;


2. 서버 프로그램

        Socket sock;
        Socket acc;

        public MainForm()
        {
            InitializeComponent();
        }

        Socket socket()
        {
            return new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            sock = socket();

            sock.Bind(new IPEndPoint(0, 3));
            sock.Listen(0);

            new Thread(delegate()
            {
                acc = sock.Accept();
                MessageBox.Show("서버: CONNECTION ACCEPTED!");
                sock.Close();

                while(true)
                {
                    try
                    {
                        byte[] buffer = new byte[255];
                        int rec = acc.Receive(buffer, 0, buffer.Length, SocketFlags.None);

                        if (rec <= 0)
                        {
                            throw new SocketException();
                        }

                        Array.Resize(ref buffer, rec);

                        Invoke((MethodInvoker)delegate
                        {
                            listBox1.Items.Add(Encoding.UTF8.GetString(buffer));
                        });

                    }
                    catch 
                    {
                        MessageBox.Show("서버: DISCONNECTION!");
                        acc.Close();
                        acc.Dispose();
                        break;
                    }
                }
                Application.Exit();
            }).Start();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            try
            {
                byte[] data = Encoding.UTF8.GetBytes(textBox1.Text);
                acc.Send(data, 0, data.Length, 0);
            }
            catch(SocketException ex) {
                MessageBox.Show(ex.Message.ToString());
            }
        }

3. 클라이언트 프로그램

        Socket sock;
        public MainForm()
        {
            InitializeComponent();
            sock = socket();
            FormClosing += new FormClosingEventHandler(MainForm_FormClosing);
        }

        void MainForm_FormClosing(object sender, FormClosingEventArgs e)
        {
            sock.Close();
        }

        Socket socket()
        {
            return new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        }

        void read()
        {
            while (true)
            {
                try
                {
                    byte[] buffer = new byte[255];
                    int rec = sock.Receive(buffer, 0, buffer.Length, SocketFlags.None);
                    
                    if (rec <= 0)
                    {
                        throw new SocketException();
                    }

                    Array.Resize(ref buffer, rec);

                    Invoke((MethodInvoker)delegate
                    {
                        listBox1.Items.Add(Encoding.UTF8.GetString(buffer));
                    });
                }
                catch {
                    MessageBox.Show("클라이언트: DISCONNECTION");
                    sock.Close();
                    break;                    
                }
            }
            Application.Exit();
        }

        private void btn_connect_Click(object sender, EventArgs e)
        {
            try { 
                sock.Connect(new IPEndPoint(IPAddress.Parse(textBox1.Text), 3));
                new Thread(() =>
                    {
                        read();
                    }).Start();
            }
            catch
            {
                MessageBox.Show("클라이언트: CONNECTION FAILED!");
            }
        }

        private void btn_send_Click(object sender, EventArgs e)
        {
            byte[] data = Encoding.UTF8.GetBytes(textBox2.Text);
            sock.Send(data, 0, data.Length, SocketFlags.None);
        }

posted by 따시쿵