private void PictureBox1_Click(object sender, EventArgs e)
        {
            if (!mainSock.IsBound)
            {
                MsgBoxHelper.Warn("서버가 실행되고 있지 않습니다!");
                return;
            }

            send_x = p.X.ToString();
            send_y = p.Y.ToString();
            byte[] x = Encoding.UTF8.GetBytes("Server" + ':' + tts + ':' + send_x + ':' + send_y + ':');
            sendAll(null, x);
            AppendText(txtHistory, string.Format("[보냄]server: {0} x좌표{1}, y좌표{2}", tts, send_x, send_y));
        }
Exemple #2
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);
        }
Exemple #3
0
        // 시작 버튼
        private void BeginStartServer(object sender, EventArgs e)
        {
            int port = 15000;

            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("서버가 실행되었습니다."));
        }
        void OnSendData(object sender, EventArgs e)
        {
            // 서버가 대기중인지 확인한다.
            if (!mainSock.IsBound)
            {
                MsgBoxHelper.Warn("서버가 실행되고 있지 않습니다!");
                return;
            }

            // 보낼 텍스트
            tts = txtTTS.Text.Trim();

            send_x = p.X.ToString();
            send_y = p.Y.ToString();

            if (string.IsNullOrEmpty(tts))
            {
                MsgBoxHelper.Warn("텍스트가 입력되지 않았습니다!");
                txtTTS.Focus();
                return;
            }

            /*
             * // 문자열을 utf8 형식의 바이트로 변환한다.
             * byte[] bDts = Encoding.UTF8.GetBytes("Server" + ':' + tts);
             *
             * // 연결된 모든 클라이언트에게 전송한다.
             * sendAll(null, bDts);
             *
             * // 전송 완료 후 텍스트박스에 추가하고, 원래의 내용은 지운다.
             * AppendText(txtHistory, string.Format("[보냄]server: {0}", tts));
             * txtTTS.Clear();
             */

            // 문자열을 utf8 형식의 바이트로 변환한다.
            byte[] x = Encoding.UTF8.GetBytes("Server" + ':' + tts + ':' + send_x + ':' + send_y + ':');
            txtTTS.Clear();

            // 연결된 모든 클라이언트에게 전송한다.
            sendAll(null, x);

            // 전송 완료 후 텍스트박스에 추가하고, 원래의 내용은 지운다.
            AppendText(txtHistory, string.Format("[보냄]server: {0}, x좌표{1}, y좌표{2}", tts, send_x, send_y));
            Console.WriteLine(send_x);
            Console.WriteLine(send_y);
            txtTTS.Clear();
        }
Exemple #5
0
        private void OnSendData(object sender, EventArgs e)
        {
            return;

            // 서버가 대기중인지 확인한다.
            if (!_mainSock.IsBound)
            {
                MsgBoxHelper.Warn("서버가 실행되고 있지 않습니다!");
                return;
            }

            // 보낼 텍스트
            string tts = txtTTS.Text.Trim();

            if (string.IsNullOrEmpty(tts))
            {
                MsgBoxHelper.Warn("텍스트가 입력되지 않았습니다!");
                txtTTS.Focus();
                return;
            }

            // 문자열을 utf8 형식의 바이트로 변환한다.
            byte[] bDts = Encoding.UTF8.GetBytes(_thisAddress.ToString() + '\x01' + tts);

            // 연결된 모든 클라이언트에게 전송한다.
            for (int i = _connectedClients.Count - 1; i >= 0; i--)
            {
                Socket socket = _connectedClients[i];
                try { socket.Send(bDts); }
                catch
                {
                    // 오류 발생하면 전송 취소하고 리스트에서 삭제한다.
                    try { socket.Dispose(); } catch { }
                    _connectedClients.RemoveAt(i);
                }
            }

            // 전송 완료 후 텍스트박스에 추가하고, 원래의 내용은 지운다.
            AppendText(txtHistory, string.Format("[보냄]{0}: {1}", _thisAddress.ToString(), tts));
            txtTTS.Clear();
        }
        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);
        }
Exemple #7
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
            {
            }
        }