예제 #1
0
        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);
        }
예제 #2
0
        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);
        }