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); }
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(); } }