Example #1
0
        //메시지 받는부분
        void DataReceived(IAsyncResult ar)
        {
            //BeginReceive에서 추가적으로 넘어온 데이터를 AsyncObject형식으로 변환
            AsyncObject obj = (AsyncObject)ar.AsyncState;

            //데이터 수신 끝
            int received = obj.WorkingSocket.EndReceive(ar);

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

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

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

            //텍스트박스에 추가해준다
            //비동기식으로 작업하기 때문에 폼의 UI스레드에서 작업을해야함
            //대리자를 이용해 처리함
            AppendText(messagelog, string.Format($"[받음] {ip}: {msg}"));

            //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);
                        }
                    }
                }
            }
            //데이터를 받은 후 다시 버퍼를 비워주고 수신대기
            obj.ClearBuffer();
            //수신대기
            obj.WorkingSocket.BeginReceive(obj.Buffer, 0, 4096, 0, DataReceived, obj);
        }
        void AcceptCallback(IAsyncResult ar)
        {
            //연결요청을 수락
            client = socket.EndAccept(ar);

            //다른 연결 요청
            socket.BeginAccept(AcceptCallback, null);

            AsyncObject ao = new AsyncObject(4000);

            ao.WorkingSocket = client;

            connectedClients.Add(client);

            msgBox.Text += "\r\n상대방 [" + client.RemoteEndPoint + "]가 연결되었습니다.";

            //클라이언트의 데이터를 받음
            client.BeginReceive(ao.Buffer, 0, 4000, 0, DataReceivced, ao);
        }
Example #3
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(logbox, string.Format($"IP : {client.RemoteEndPoint}가 접속했습니다."));

            //클라이언트의 데이터를 받음
            client.BeginReceive(obj.Buffer, 0, 4096, 0, DataReceived, obj);
        }
        void DataReceivced(IAsyncResult ar)
        {
            AsyncObject ao = (AsyncObject)ar.AsyncState;

            int received = ao.WorkingSocket.EndReceive(ar);

            if (received <= 0)
            {
                ao.WorkingSocket.Close();
                return;
            }

            string text = Encoding.UTF8.GetString(ao.Buffer);

            string[] t    = text.Split('>');
            string   name = t[0];
            string   msg  = t[1];

            msgBox.Text += "\r\n" + name + ": " + msg;

            for (int i = connectedClients.Count - 1; i >= 0; i--)
            {
                Socket client_socket = connectedClients[i];
                if (client_socket != ao.WorkingSocket)
                {
                    try { client_socket.Send(ao.Buffer); }
                    catch
                    {
                        try { client_socket.Dispose(); }
                        catch { }
                        connectedClients.RemoveAt(i);
                    }
                }
            }

            ao.ClearBuffer();

            ao.WorkingSocket.BeginReceive(ao.Buffer, 0, 4000, 0, DataReceivced, ao);
        }