private void Recieve_Completed(object sender, SocketAsyncEventArgs e)
        {
            Socket   _client   = (Socket)sender;
            Telegram _telegram = (Telegram)e.UserToken;

            _telegram.SetLength(e.Buffer);
            _telegram.InitData();
            if (_client.Connected)
            {
                _client.Receive(_telegram.Data, _telegram.DataLength, SocketFlags.None);
                SendDisplay(_telegram.GetData(), ChatType.Receive);
                _client.ReceiveAsync(e);
            }
            else
            {
                SendDisplay("Connection Failed!", ChatType.System);
                m_Client = null;
            }
        }
示例#2
0
        private void Recieve_Completed(object sender, SocketAsyncEventArgs e)
        {
            Socket _client = (Socket)sender;
            Telegram _telegram = new Telegram();
            _telegram.SetLength(e.Buffer);
            _telegram.InitData();
            if (_client.Connected)
            {
                //서버에서 Send()함수를 통해 전송된 내용을 Receive()함수로 수신합니다.
                _client.Receive(_telegram.Data, _telegram.DataLength, SocketFlags.None);

                //수신된 Data중 맨 처음 글자를 분석합니다. "M"인경우 Message, "F"인경우 File
                string strMessageType = Encoding.Unicode.GetString(_telegram.Data).Substring(0, 1);
                int nLength = Encoding.Unicode.GetString(_telegram.Data).Length;
                //일반 Message이므로 Console에 뿌려줍니다.
                if (strMessageType == "M")
                {
                    SendDisplay(Encoding.Unicode.GetString(_telegram.Data).Substring(1, nLength - 1), ChatType.Receive);
                }
                //File인 경우
                else if (strMessageType == "F")
                {
                    try
                    {
                        //수신된 맨 앞 2바이트는 File,Message구분에 사용되었으므로 건너뜁니다.
                        //다음 4byte를 분석해 file이름의 크기를 구합니다.
                        byte[] byteArrayFileNameLength = new byte[4];
                        System.Buffer.BlockCopy(_telegram.Data, 2, byteArrayFileNameLength, 0, 4);

                        //file이름의 크기만큼 분석해 file이름을 얻어옵니다.
                        int nFileNameLength = BitConverter.ToInt32(byteArrayFileNameLength, 0);
                        byte[] byteArrayFileName = new byte[nFileNameLength];
                        System.Buffer.BlockCopy(_telegram.Data, 2 + 4, byteArrayFileName, 0, nFileNameLength);

                        //나머지 데이터는 실제 File을 구성하는 Data입니다.
                        int nFileDataLength = _telegram.Data.Length - 2 - 4 - nFileNameLength;
                        byte[] byteArrayFileData = new byte[nFileDataLength];
                        System.Buffer.BlockCopy(_telegram.Data, 2 + 4 + nFileNameLength, byteArrayFileData, 0, nFileDataLength);

                        //클라이언트가 실행중인 경로에 file을 저장합니다.
                        string strRootPath = System.IO.Directory.GetCurrentDirectory();
                        string strFileName = Encoding.Unicode.GetString(byteArrayFileName);
                        strFileName = strRootPath + "\\"+ strFileName;
                        File.WriteAllBytes(strFileName, byteArrayFileData);

                        SendDisplay(string.Format("File is recieved : {0}", strFileName), ChatType.Receive);
                    }
                    catch
                    {
                        //...
                        return;
                    }
                }
                _client.ReceiveAsync(e);
            }
            else
            {
                SendDisplay("Connection Failed!", ChatType.System);
                m_Client = null;
            }
        }