void AcceptCallback(IAsyncResult ar) { // 클라이언트의 연결 요청을 수락한다. Socket client = mainSock.EndAccept(ar); // 또 다른 클라이언트의 연결을 대기한다. mainSock.BeginAccept(AcceptCallback, null); AsyncObject obj = new AsyncObject(4096);//버퍼크기 4096 obj.WorkingSocket = client; // 연결된 클라이언트 리스트에 추가해준다. connectedClients.Add(client); // 텍스트박스에 클라이언트가 연결되었다고 써준다. AppendText(txtHistory, string.Format("클라이언트 (@ {0})가 연결되었습니다.", client.RemoteEndPoint)); // 클라이언트의 데이터를 받는다. client.BeginReceive(obj.Buffer, 0, 4096, 0, DataReceived, obj); }
void DataReceived(IAsyncResult ar)//데이터 수신 시 { try { // BeginReceive에서 추가적으로 넘어온 데이터를 AsyncObject 형식으로 변환한다. AsyncObject obj = (AsyncObject)ar.AsyncState; //데이터 수신을 끝낸다. 오류해결 int received = obj.WorkingSocket.EndReceive(ar); //받은 데이터가 없으면(연결끊어짐) 끝낸다. if (received <= 0) { obj.WorkingSocket.Disconnect(false); obj.WorkingSocket.Close(); return; } //텍스트로 변환한다. string text = Encoding.UTF8.GetString(obj.Buffer); string[] tokens = text.Split(':'); //기준 string id = Decrypt256(tokens[0], key); //복호화 보낸사람 ID //string msg = Decrypt256(tokens[1],key);//메세지 string[] message; //배열로 받음 message = tokens[1].Split('='); //=기준으로 앞쪽 살아있는 정보만 수신 message[0] += "=="; string msg = Decrypt256(message[0], key); //복호화 후 메세지 // 텍스트박스에 추가해준다. // 비동기식으로 작업하기 때문에 폼의 UI 스레드에서 작업을 해줘야 한다. // 따라서 대리자를 통해 처리한다. AppendText(txtHistory, string.Format(DateTime.Now.ToString("HH:mm:ss") + "[받음]{0}: {1}", id, 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); } catch { //오류발생시 폼 종료 Application.Exit(); } }