Exemple #1
0
        public void OnSendData(bool isSendall, Socket clientSocket, int msgCount, int itemCount, string target, string type, string state, string info)// 전체인가?/보낸사람/보낼내용
        {
            AsyncObject ao = new AsyncObject();

            // 문자열을 바이트 배열으로 변환
            //string message =
            ao.buffer = Encoding.UTF8.GetBytes('\x01' + msgCount.ToString() + '|' + itemCount.ToString() + '|' + target + '|' + type + '|' + state + '|' + info + '|' + '\x01');

            ao.workingSocket = clientSocket;


            for (int i = connectedClients.Count - 1; i >= 0; i--)
            {
                Socket socket = connectedClients[i].clientSocket;
                if (isSendall)
                {
                    try
                    {
                        socket.BeginSend(ao.buffer, 0, ao.buffer.Length, 0, new AsyncCallback(SendCallback), socket);
                    }
                    catch // 오류 발생하면 전송 취소하고 리스트에서 삭제한다.
                    {
                        try { socket.Dispose(); } catch { }
                        connectedClients.RemoveAt(i);
                    }
                }
                else
                {
                    if (socket == ao.workingSocket)
                    {
                        try
                        {
                            socket.BeginSend(ao.buffer, 0, ao.buffer.Length, 0, new AsyncCallback(SendCallback), socket);
                        }
                        catch // 오류 발생하면 전송 취소하고 리스트에서 삭제한다.
                        {
                            try { socket.Dispose(); } catch { }
                            connectedClients.RemoveAt(i);
                        }
                    }
                }
            }
            //AppendText(server_log_richtextbox, string.Format("연결된 클라이언트 갯수 : {0}", connectedClients.Count));
        }
Exemple #2
0
        void AcceptCallback(IAsyncResult ar)
        {
            // 클라이언트의 연결 요청을 수락한다.
            Socket client = mainSock.EndAccept(ar);

            // 또 다른 클라이언트의 연결을 대기한다.
            mainSock.BeginAccept(AcceptCallback, null);

            AsyncObject obj = new AsyncObject(4096);

            obj.WorkingSocket = client;

            // 연결된 클라이언트 리스트에 추가해준다.
            connectedClients.Add(client);

            // 텍스트박스에 클라이언트가 연결되었다고 써준다.
            AppendText(server_log_richtextbox, string.Format("클라이언트 (@ {0})가 연결되었습니다.", client.RemoteEndPoint));

            // 클라이언트의 데이터를 받는다.
            client.BeginReceive(obj.Buffer, 0, 4096, 0, DataReceived, obj);
        }
Exemple #3
0
        private void AcceptCallback(IAsyncResult ar)
        {
            // 클라이언트의 연결 요청을 수락한다.
            Socket client = mainSock.EndAccept(ar);

            // 또 다른 클라이언트의 연결을 대기한다.
            mainSock.BeginAccept(AcceptCallback, null);

            AsyncObject obj = new AsyncObject();

            obj.workingSocket = client;

            // 연결된 클라이언트 리스트에 추가해준다.
            clientSocketList.setClient(client, "root");

            // 텍스트박스에 클라이언트가 연결되었다고 써준다.
            AppendText(server_log_richtextbox, string.Format("클라이언트 (@ {0})가 연결되었습니다.", client.RemoteEndPoint));

            // 클라이언트의 데이터를 받는다.
            client.BeginReceive(obj.buffer, 0, 2048, 0, DataReceived, obj);
        }
Exemple #4
0
        void DataReceived(IAsyncResult ar)
        {
            // BeginReceive에서 추가적으로 넘어온 데이터를 AsyncObject 형식으로 변환한다.
            AsyncObject obj = (AsyncObject)ar.AsyncState;
            int         received;

            try
            {
                // 데이터 수신을 끝낸다.
                received = obj.WorkingSocket.EndReceive(ar);
            }
            catch
            {
                obj.WorkingSocket.Close();
                return;
            }
            // 받은 데이터가 없으면(연결끊어짐) 끝낸다.
            if (received <= 0)
            {
                obj.WorkingSocket.Close();
                return;
            }

            // 텍스트로 변환한다.
            string text = Encoding.UTF8.GetString(obj.Buffer);

            // 0x01 기준으로 짜른다.
            // tokens[0] - 보낸 사람 IP
            // tokens[1] - 보낸 메세지
            string[] tokens = text.Split('\x01');
            string   ip     = tokens[0];
            string   msg    = tokens[1];

            // 텍스트박스에 추가해준다.
            // 비동기식으로 작업하기 때문에 폼의 UI 스레드에서 작업을 해줘야 한다.
            // 따라서 대리자를 통해 처리한다.
            AppendText(server_log_richtextbox, string.Format("[받음]{0}: {1}", ip, msg));
            string[] words = msg.Split(';');
            switch (words[0])
            {
            case "login":
                OnSendData("success;", null);
                break;
            }
            // for을 통해 "역순"으로 클라이언트에게 데이터를 보낸다.
            for (int i = connectedClients.Count - 1; i >= 0; i--)
            {
                Socket socket = connectedClients[i];
                if (socket != obj.WorkingSocket)
                {
                    try { socket.Send(obj.Buffer); }
                    catch
                    {
                        // 오류 발생하면 전송 취소하고 리스트에서 삭제한다.
                        try { socket.Dispose(); } catch { }
                        connectedClients.RemoveAt(i);
                    }
                }
            }
            AppendText(server_log_richtextbox, string.Format("현재 클라이언트 수 : {0}", connectedClients.Count));

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

            // 수신 대기
            obj.WorkingSocket.BeginReceive(obj.Buffer, 0, 4096, 0, DataReceived, obj);
        }
Exemple #5
0
        private void DataReceived(IAsyncResult ar)
        {
            // BeginReceive에서 추가적으로 넘어온 데이터를 AsyncObject 형식으로 변환한다.
            AsyncObject obj    = (AsyncObject)ar.AsyncState;
            Socket      client = obj.workingSocket;
            int         received;

            try
            {
                // 데이터 수신을 끝낸다.
                received = client.EndReceive(ar);
                //Console.WriteLine("receive : ", received);
            }
            catch
            {
                client.Close();
                return;
            }
            // 받을 데이터가 있다.
            if (received > 0)
            {
                obj.sb.Append(Encoding.UTF8.GetString(obj.buffer, 0, received));

                obj.ClearBuffer();         //버퍼 비우기
                if (client.Available == 0) //네트워크상에 받을 데이터가 없다.
                {
                    //Console.WriteLine("수신 종료");
                    string msg = obj.sb.ToString(); //전체 내용
                    obj.sb.Clear();                 //이어가던 내용 초기화(메시지 끝이므로)
                    Console.WriteLine(msg);         //총 받은 메시지

                    string[] tokens = msg.Split('\x01');
                    for (int msgNum = 0; msgNum < tokens.Length; msgNum++)
                    {
                        if (!tokens[msgNum].Equals("") && tokens[msgNum][0] != '\0')
                        {
                            sendMsgcount++;
                            string[] msgs       = tokens[msgNum].Split('\x02');
                            string   ip         = msgs[0];
                            string   clientData = msgs[1];
                            AppendText(server_log_richtextbox, string.Format("수신 내용 {0} : {1}", ip, clientData));
                            //bool sendAll = cmdHandler.IdentifySendAll(clientData);//전체 송신인지 판별
                            Thread t1 = new Thread(() => run(obj.workingSocket, clientData, sendMsgcount));
                            t1.Start();

                            //AppendText(server_log_richtextbox, string.Format("연결된 클라이언트 갯수 : {0}", connectedClients.Count));
                        }
                    }
                }
            }

            // 받은 데이터가 없으면(연결끊어짐) 끝낸다.
            if (received <= 0)
            {
                AppendText(server_log_richtextbox, string.Format("연결 종료"));
                obj.workingSocket.Close();
                return;
            }


            client.BeginReceive(obj.buffer, 0, 2048, 0, DataReceived, obj);
        }