예제 #1
0
        public void SendData(object dataToSend, bool dontWait = false)
        {
            var data = DataConverter.SerializeData(dataToSend);

            //Add size to vegin of the array
            var dataSize = (short)data.Length;

            DataConverter.FromInt(dataSize, out var byte1, out var byte2, out var byte3, out var byte4);

            // Add data size to the beginning
            data = DataConverter.MergeByteArrays(new byte[] { byte1, byte2, byte3, byte4 }, data);

            try
            {
                if (!dontWait)
                {
                    //Begin sending file
                    ClientReceiveDone.WaitOne(7000);
                    ClientReceiveDone.Reset();
                }

                HandledSocket.BeginSend(data, 0, data.Length, 0, new AsyncCallback(SendCallback), null);
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                Disconnect();
            }
        }
예제 #2
0
 public void ReceiveData()
 {
     try
     {
         HandledSocket.BeginReceive(Buffer, 0, BufferSize, 0, new AsyncCallback(ReceiveCallback), null);
     }
     catch (Exception e)
     {
         Console.WriteLine(e.Message);
         Disconnect();
     }
 }
예제 #3
0
        public void Disconnect()
        {
            HandledSocket.Close();
            HandledSocket.Dispose();
            ClientDisconnected?.Invoke(this);

            //Set user status to offline
            if (UserInfo != null)
            {
                HandleCommand(new Command(CommandType.SignOut, null, UserInfo));
            }
        }
예제 #4
0
 void SendCallback(IAsyncResult ar)
 {
     try
     {
         //Complate sending data
         int bytesSent = HandledSocket.EndSend(ar);
     }
     catch (Exception e)
     {
         Console.WriteLine(e.Message);
         Disconnect();
     }
 }
예제 #5
0
        void ReceiveCallback(IAsyncResult ar)
        {
            int bytesRead;

            // If user disconects than we will catch that
            try
            {
                //Read data from the client socket
                bytesRead = HandledSocket.EndReceive(ar);
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                Disconnect();
                return;
            }


            if (bytesRead > 0)
            {
                //Check lable and resume sending
                if (Encoding.Default.GetString(Buffer).Contains("<EndOfReceiving>"))
                {
                    ClientReceiveDone.Set();
                    ReceiveData();
                    return;
                }

                //If it's first portion of data
                if (BinReceivedData.Count == 0)
                {
                    //get data size
                    dataSize = DataConverter.ToInt(Buffer[0], Buffer[1], Buffer[2], Buffer[3]) + 4;
                }

                //Delete size of received data
                dataSize -= Buffer.Length;

                if (dataSize <= 0)
                {
                    //Separate data from dummy bytes
                    byte[] temp = new byte[dataSize + Buffer.Length];
                    Array.Copy(Buffer, 0, temp, 0, dataSize + Buffer.Length);

                    //Copy buffer to bin recieved data
                    BinReceivedData.AddRange(temp);

                    //Remove first 2 bytes(size of data)
                    BinReceivedData.RemoveRange(0, 4);

                    //Send signal to resume receiving
                    SendData("<EndOfReceiving>", true);

                    HandleCommand();

                    ReceiveData();
                }
                else
                {
                    //Copy buffer to bin recieved data
                    BinReceivedData.AddRange(Buffer);

                    ReceiveData();
                }
            }
        }