public void StartReceiving()
 {
     if (!connected)
     {
         return;
     }
     try
     {
         var readEvent   = new AutoResetEvent(false);
         var recieveArgs = new SocketAsyncEventArgs()
         {
             UserToken = readEvent
         };
         byte[] buffer = new byte[BufferSize];
         recieveArgs.SetBuffer(buffer, 0, BufferSize);
         recieveArgs.Completed += recieveArgs_Completed;
         stopReceiver           = false;
         do
         {
             client.ReceiveAsync(recieveArgs);
             readEvent.WaitOne();//Wait for recieve
             if (!IsConnected)
             {
                 stopReceiver = true;
             }
         } while (!stopReceiver);
         recieveArgs.Completed -= recieveArgs_Completed;
     }
     catch (Exception e)
     {
         State        = NetworkStates.NetworkError;
         networkError = e;
         SendData(State.ToString(), TransmitedDataType.Status);
     }
 }
        void AcceptSocket(IAsyncResult result)
        {
            try
            {
                var server = ((TcpListener)result.AsyncState);
                client = ((TcpListener)result.AsyncState).EndAcceptSocket(result);
                Console.WriteLine("Connection accepted from " + client.RemoteEndPoint);
                connected = true;
                if (OnClientConnected != null)
                {
                    OnClientConnected.Invoke(client);
                }

                State        = NetworkStates.Connected;
                ClientState  = NetworkStates.Connected;
                networkError = null;
                SendData(State.ToString(), TransmitedDataType.Status);
                if (AutoStart)
                {
                    StartReceiving();
                }
            }
            catch (Exception e)
            {
                State        = NetworkStates.NetworkError;
                networkError = e;
            }
        }
 public void Disconnect()
 {
     if (connected)
     {
         try
         {
             State = NetworkStates.Disconnected;
             SendData(State.ToString(), TransmitedDataType.Status);
             System.Threading.Thread.Sleep(2000);
             StopReceiving();
             client.Close();
             connected = false;
         }
         catch (Exception e)
         {
             networkError = e;
             State        = NetworkStates.NetworkError;
         }
     }
 }
        public void StartReceiving()
        {
            if (!connected)
            {
                return;
            }
            try
            {
                stopReceiver = false;
                byte[] buffer = new byte[BufferSize];

                connectionStream.BeginRead(buffer, 0, BufferSize, dataRead, buffer);
                networkError = null;
            }
            catch (Exception e)
            {
                networkError = e;
                State        = NetworkStates.NetworkError;
                SendData(State.ToString(), TransmitedDataType.Status);
            }
        }
        // ~ClientModel()
        //{
        //    if(connected)
        //    {
        //        StopReceiving();
        //        Disconnect();
        //        client = null;
        //    }
        //}

        public bool ConnectToServer()
        {
            try
            {
                //commenting out this section since when connecting in a loop it throws exception becaue here we used iasyc
                //IAsyncResult ar = client.BeginConnect(IP, port, null, client);
                //bool result = ar.AsyncWaitHandle.WaitOne(1000, false);

                //if (!result || !client.Connected)
                //{
                //    State = NetworkStates.FailedToConnect;
                //    return false;
                //}

                client.Connect(IP, port);
                // use the ipaddress as in the server program
                connectionStream = client.GetStream();
                Console.WriteLine("Connected");
                connected = true;
                if (OnConnectedToServer != null)
                {
                    OnConnectedToServer.Invoke(client.Client);
                }
                State        = NetworkStates.Connected;
                ServerState  = NetworkStates.Connected;
                networkError = null;
                SendData(State.ToString(), TransmitedDataType.Status);
                if (AutoStart)
                {
                    StartReceiving();
                }
                return(true);
            }
            catch (System.Net.Sockets.SocketException sockEx)
            {
                networkError = sockEx;
                State        = NetworkStates.NetworkError;
            }
            return(false);
        }