Пример #1
0
        // 시작 버튼
        private void BeginStartServer(object sender, EventArgs e)
        {
            for (int i = 0; i < problem.Length; i++)
            {
                AppendText(txtHistory, string.Format("{0}", problem[i]));
            }
            int port;

            if (!int.TryParse(txtPort.Text, out port))
            {
                MsgBoxHelper.Error("포트 번호가 잘못 입력되었거나 입력되지 않았습니다.");
                txtPort.Focus();
                txtPort.SelectAll();
                return;
            }
            if (mainSock.IsBound)
            {
                MsgBoxHelper.Warn("서버가 실행중입니다.");
                return;
            }
            IPEndPoint serverEP = new IPEndPoint(thisAddress, port);

            mainSock.Bind(serverEP);
            mainSock.Listen(10);
            mainSock.BeginAccept(AcceptCallback, null);
            AppendText(txtHistory, string.Format("서버가 실행되었습니다."));
        }
Пример #2
0
        void BeginStartServer(object sender, EventArgs e)
        {
            int port;

            if (!int.TryParse(txtPort.Text, out port))   //문자열을 int port로 변환
            {
                MsgBoxHelper.Error("포트 번호가 잘못 입력되었거나 입력되지 않았습니다.");
                txtPort.Focus();
                txtPort.SelectAll();
                return;
            }

            thisAddress = IPAddress.Parse(txtAddress.Text);
            if (thisAddress == null)
            {// 로컬호스트 주소를 사용한다.
                thisAddress     = IPAddress.Loopback;
                txtAddress.Text = thisAddress.ToString();
            }

            // 서버에서 클라이언트의 연결 요청을 대기하기 위해
            // 소켓을 열어둔다.
            IPEndPoint serverEP = new IPEndPoint(thisAddress, port);

            mainSock.Bind(serverEP);
            mainSock.Listen(10);

            AppendText(txtHistory, string.Format("서버 시작: @{0}", serverEP));
            // 비동기적으로 클라이언트의 연결 요청을 받는다.
            mainSock.BeginAccept(AcceptCallback, null);
        }
Пример #3
0
        void BeginStartServer(object sender, EventArgs e)
        {
            int port;

            if (!int.TryParse(txtPort.Text, out port))
            {
                MsgBoxHelper.Error("포트 번호가 잘못 입력되었거나 입력되지 않았습니다.");
                txtPort.Focus();
                txtPort.SelectAll();
                return;
            }

            IPHostEntry he = Dns.GetHostEntry(Dns.GetHostName());

            // 처음으로 발견되는 ipv4 주소를 사용한다.
            foreach (IPAddress addr in he.AddressList)
            {
                if (addr.AddressFamily == AddressFamily.InterNetwork)
                {
                    //AppendText(txtHistory, addr.ToString());
                    string[] ip = addr.ToString().Split('.');
                    // ! A, B, C 클래스 제외
                    if (ip[0].Equals("172") || ip[0].Equals("192") || ip[0].Equals("10") || ip[0].Equals("169") || ip[0].Equals("127") ||
                        ip[0].Equals("0") || ip[0].Equals("224") || ip[0].Equals("240") || ip[0].Equals("239") || (ip[0].Equals("192") &&
                                                                                                                   ip[1].Equals("168")) || (ip[0].Equals("172") && Convert.ToInt32(ip[1]) >= 16 && Convert.ToInt32(ip[1]) <= 31))
                    {
                        //AppendText(txtHistory, "포함");
                    }
                    else
                    {
                        thisAddress = IPAddress.Parse(addr.ToString());
                    }
                }
            }
            // 서버에서 클라이언트의 연결 요청을 대기하기 위해
            // 소켓을 열어둔다.

            IPEndPoint serverEP = new IPEndPoint(thisAddress, serverPort);

            udpSock.Bind(serverEP);
            mainSock.Bind(serverEP);
            mainSock.Listen(10);

            AppendText(txtHistory, string.Format("서버 시작: @{0}", serverEP));
            AppendText(txtAddress, thisAddress.ToString());
            // 비동기적으로 클라이언트의 연결 요청을 받는다.
            //udpSock.BeginAccept(AcceptCallback, null);
            mainSock.BeginAccept(AcceptCallback, null);
        }
Пример #4
0
        void BeginStartServer(object sender, EventArgs e)
        {
            int port;

            if (!int.TryParse(txtPort.Text, out port))
            {
                MsgBoxHelper.Error("포트 번호가 잘못 입력되었거나 입력되지 않았습니다.");
                txtPort.Focus();
                txtPort.SelectAll();
                return;
            }

            // 서버에서 클라이언트의 연결 요청을 대기하기 위해
            // 소켓을 열어둔다.
            IPEndPoint serverEP = new IPEndPoint(thisAddress, port);

            mainSock.Bind(serverEP);
            mainSock.Listen(10);

            // 비동기적으로 클라이언트의 연결 요청을 받는다.
            mainSock.BeginAccept(AcceptCallback, null);
        }
Пример #5
0
        void DataReceived(IAsyncResult ar)
        {
            // BeginReceive에서 추가적으로 넘어온 데이터를 AsyncObject 형식으로 변환한다.
            AsyncObject obj = (AsyncObject)ar.AsyncState;

            try
            {
                // 데이터 수신을 끝낸다.
                int received = obj.WorkingSocket.EndReceive(ar);

                // 받은 데이터가 없으면(연결끊어짐) 끝낸다.
                if (received <= 0)
                {
                    obj.WorkingSocket.Disconnect(false);
                    obj.WorkingSocket.Close();
                    return;
                }

                Console.WriteLine(obj.Buffer);
                // 텍스트로 변환한다.
                string text = Encoding.UTF8.GetString(obj.Buffer);
                Console.WriteLine("데이터 브로드 캐스트" + text);
                string[] arrayText;
                arrayText = text.ToString().Split('?');
                DataForm data = new DataForm();
                data = JsonConvert.DeserializeObject <DataForm>(arrayText[0]);
                if (data.req == null)
                {
                    MsgBoxHelper.Error("null");
                    data.req = "";
                }
                if (data.req.Equals("close"))
                {
                    MsgBoxHelper.Error("close 들어옴");
                    Console.WriteLine("close 들어옴");
                    obj.WorkingSocket.Disconnect(false);
                    obj.WorkingSocket.Close();
                }

                // 텍스트박스에 추가해준다.
                // 비동기식으로 작업하기 때문에 폼의 UI 스레드에서 작업을 해줘야 한다.
                // 따라서 대리자를 통해 처리한다.


                AppendText(txtHistory, string.Format("[받음]{0}: {1}", data.id, data.text));

                // for을 통해 "역순"으로 클라이언트에게 데이터를 보낸다.
                for (int i = connectedClients.Count - 1; i >= 0; i--)
                {
                    Socket socket = connectedClients[i];
                    if (socket != obj.WorkingSocket)
                    {
                        try
                        {
                            string request = JsonConvert.SerializeObject(data);
                            AESEncrypt256(request, key);
                            Encoding.UTF8.GetBytes(AESEncrypt256(request, key));
                            Console.WriteLine("이 암호화된 내용으로 브로드 캐스팅 : " + AESEncrypt256(request, key));
                            socket.Send(Encoding.UTF8.GetBytes(AESEncrypt256(request, key)));
                        }
                        catch
                        {
                            // 오류 발생하면 전송 취소하고 리스트에서 삭제한다.
                            try { socket.Dispose(); } catch { }
                            // connectedClients.RemoveAt(i);
                        }
                    }
                }

                // 데이터를 받은 후엔 다시 버퍼를 비워주고 같은 방법으로 수신을 대기한다.
                obj.ClearBuffer();

                // 수신 대기
                obj.WorkingSocket.BeginReceive(obj.Buffer, 0, 4096, 0, DataReceived, obj);
            }
            catch
            {
            }
        }