//메시지 받는부분 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); }
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); }