private void DataReceived(IAsyncResult ar) { // BeginReceive에서 추가적으로 넘어온 데이터를 AsyncObject 형식으로 변환한다. AsyncObject obj = (AsyncObject)ar.AsyncState; Socket server = obj.workingSocket; int received; try { // 데이터 수신을 끝낸다. received = server.EndReceive(ar); //Console.WriteLine("received : "+received); } catch { server.Close(); return; } // 받을 데이터가 있다. if (received <= 0) { obj.workingSocket.Close(); return; } if (received > 0) { string text = Encoding.UTF8.GetString(obj.buffer); obj.sb.Append(text); //Console.WriteLine("sb 내용" + obj.sb.ToString()); if (server.Available == 0)//네트워크상에 받을 데이터가 없다. { //Console.WriteLine("수신 종료"); string receiveData = obj.sb.ToString(); obj.sb.Clear(); //이어가던 내용 초기화(메시지 끝이므로) int counting = 0; string[] tokens = receiveData.Split('\x01'); // 버퍼 공백부분 삭제 for (int msgNum = 0; msgNum < tokens.Length; msgNum++) { if (!tokens[msgNum].Equals("") && tokens[msgNum][0] != '\0') { counting++; makeStatedata.MakeDataSet(tokens[msgNum]); } } //Console.Write(counting); } obj.ClearBuffer();//버퍼 비우기 } // 받은 데이터가 없으면(연결끊어짐) 끝낸다. server.BeginReceive(obj.buffer, 0, 2048, 0, DataReceived, obj); }
static void DataReceived(IAsyncResult ar) { // BeginReceive에서 추가적으로 넘어온 데이터를 AsyncObject 형식으로 변환한다. AsyncObject obj = (AsyncObject)ar.AsyncState; // 데이터 수신을 끝낸다. int received = obj.WorkingSocket.EndReceive(ar); // 받은 데이터가 없으면(연결끊어짐) 끝낸다. if (received <= 0) { obj.WorkingSocket.Close(); return; } // UTF8 인코더를 사용하여 바이트 배열을 문자열로 변환한다. string text = Encoding.UTF8.GetString(obj.Buffer); // 0x01 기준으로 짜른다. // tokens[0] - 보낸 사람 IP // tokens[1] - 보낸 메세지 string[] tokens = text.Split('\x01'); string ip = tokens[0]; string msg = tokens[1]; // 클라이언트에선 데이터를 전달해줄 필요가 없으므로 바로 수신 대기한다. // 데이터를 받은 후엔 다시 버퍼를 비워주고 같은 방법으로 수신을 대기한다. string[] msgs = msg.Split(';'); if (msgs[0].Equals("success")) { socket_event("success"); } obj.ClearBuffer(); // 수신 대기 obj.WorkingSocket.BeginReceive(obj.Buffer, 0, 4096, 0, DataReceived, obj); }