private void HandleTcpClientAccepted(IAsyncResult ar) { if (IsRunning) { TcpListener tcpListener = (TcpListener)ar.AsyncState; TcpClient tcpClient = tcpListener.EndAcceptTcpClient(ar); byte[] buffer = new byte[tcpClient.ReceiveBufferSize]; TcpClientState internalClient = new TcpClientState(tcpClient, buffer); lock (this.clients) { this.clients.Add(internalClient); RaiseClientConnected(tcpClient); } try { NetworkStream networkStream = internalClient.NetworkStream; networkStream.BeginRead(internalClient.Buffer, 0, internalClient.Buffer.Length, HandleDatagramReceived, internalClient); tcpListener.BeginAcceptTcpClient(new AsyncCallback(HandleTcpClientAccepted), ar.AsyncState); } catch { } } }
private void HandleDatagramReceivedToVerify(IAsyncResult ar) { if (IsRunning) { TcpClientState internalClient = (TcpClientState)ar.AsyncState; NetworkStream networkStream = internalClient.NetworkStream; int numberOfReadBytes = 0; try { numberOfReadBytes = networkStream.EndRead(ar); } catch { numberOfReadBytes = 0; } if (numberOfReadBytes == 0) { //connection has been closed lock (this.clients) { this.clients.Remove(internalClient); RaiseClientDisconnected(internalClient.TcpClient); return; } } //received byte and trigger event notification byte[] receivedBytes = new byte[numberOfReadBytes]; Buffer.BlockCopy(internalClient.Buffer, 0, receivedBytes, 0, numberOfReadBytes); RaiseDatagramReceived(internalClient.TcpClient, receivedBytes); RaisePlaintextReceived(internalClient.TcpClient, receivedBytes); if (this.Encoding.GetString(receivedBytes) == LoginPassword) { //continue listening for tcp datagram packets networkStream.BeginRead(internalClient.Buffer, 0, internalClient.Buffer.Length, HandleDatagramReceived, internalClient); } else { lock (this.clients) { this.clients.Remove(internalClient); RaiseClientDisconnected(internalClient.TcpClient); return; } } } }