示例#1
0
            private void MsgCallBacktoAll(IAsyncResult ar)
            {
                // BeginReceive에서 추가적으로 넘어온 데이터를 AsyncObject 형식으로 변환한다.
                StateObject o_ClientState = (StateObject)ar.AsyncState;

                // for을 통해 "역순"으로 클라이언트에게 데이터를 보낸다.
                for (int i = lst_ConnectedClients.Count - 1; i >= 0; i--)
                {
                    Socket socket = lst_ConnectedClients[i];
                    if (socket != o_ClientState.wSocket)
                    {
                        try
                        {
                            System.Threading.Thread.Sleep(50);
                            socket.Send(o_ClientState.arrBuffer);
                        }
                        catch
                        {
                            // 오류 발생하면 전송 취소하고 리스트에서 삭제한다.
                            try { socket.Dispose(); }
                            catch { }
                            lst_ConnectedClients.RemoveAt(i);
                        }
                    }
                }

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

                // 현재 클라이언트 재수신 대기
                o_ClientState.wSocket.BeginReceive(o_ClientState.arrBuffer, 0, StateObject.iBufferSize, 0, ReadCallback, o_ClientState);
            }
示例#2
0
            private void MsgCallBackOnly(IAsyncResult ar)
            {
                // BeginReceive에서 추가적으로 넘어온 데이터를 AsyncObject 형식으로 변환한다.
                StateObject o_ClientState = (StateObject)ar.AsyncState;

                // 데이터를 받은 후엔 다시 버퍼를 비워주고 같은 방법으로 수신을 대기한다.
                o_ClientState.ClearBuffer();
                // 현재 클라이언트 재수신 대기
                o_ClientState.wSocket.BeginReceive(o_ClientState.arrBuffer, 0, StateObject.iBufferSize, 0, ReadCallback, o_ClientState);
            }
            /// <summary>
            /// 받은 데이터 처리
            /// </summary>
            /// <param name="ar"></param>
            private void DataReceived(IAsyncResult ar)
            {
                try
                {
                    StateObject connectState = (StateObject)ar.AsyncState;
                    if (!connectState.wSocket.Connected)
                    {
                        // 버퍼 비우기
                        connectState.ClearBuffer();
                        // 비동기 수신 대기
                        connectState.wSocket.BeginReceive(connectState.buffer, 0, StateObject.BUFFER_SIZE, 0, DataReceived, connectState);
                        return;
                    }

                    // 수신 끝
                    int receivedBuffer = connectState.wSocket.EndReceive(ar);

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

                    // 받은 데이터를 텍스트로 변환
                    string buffToText = Encoding.UTF8.GetString(connectState.buffer);
                    // s_Text = s_Text + '\x01' + o_State.wSocket.RemoteEndPoint.ToString();
                    string[] msg = buffToText.Split('\x01');
                    switch (msg[0])
                    {
                    //SYSTEM, CONNECT_LIST, DATA, MSG (default)
                    case "SYSTEM":
                        Append_SYSTEM_MSG(connectState.wSocket.LocalEndPoint.ToString(), msg[2]);
                        break;

                    case "CONNECT_LIST":
                        Append_NODE(connectState.wSocket.LocalEndPoint.ToString(), msg[2]);
                        break;

                    case "DATA":
                        Append_DATA(connectState.wSocket.RemoteEndPoint.ToString(), msg);
                        break;

                    case "MSG":
                        Append_Msg(msg[1], msg[2]);
                        break;

                    default:
                        Append_DataOnly(connectState.buffer);
                        break;
                    }
                    // 버퍼 비우기
                    connectState.ClearBuffer();

                    // 비동기 수신 대기
                    connectState.wSocket.BeginReceive(connectState.buffer, 0, StateObject.BUFFER_SIZE, 0, DataReceived, connectState);
                }
                catch (Exception ex)
                {
                    StartClient();
                }
            }