/// <summary> /// Handles an incoming connection. /// If incoming connections are allowed, /// the client is added to the clients list /// and triggers the client connected event. /// Else, the connection blocked event is /// triggered. /// </summary> private void HandleIncomingConnection(IAsyncResult result) { try { Socket oldSocket = (Socket)result.AsyncState; if (acceptIncomingConnections) { Socket newSocket = oldSocket.EndAccept(result); uint clientID = (uint)clients.Count + 1; TelnetClient client = new TelnetClient(clientID, (IPEndPoint)newSocket.RemoteEndPoint); clients.Add(newSocket, client); // Do Echo // Do Remote Flow Control // Will Echo // Will Suppress Go Ahead SendBytesToSocket( newSocket, new byte[] { 0xff, 0xfd, 0x01, 0xff, 0xfd, 0x21, 0xff, 0xfb, 0x01, 0xff, 0xfb, 0x03 } ); client.resetReceivedData(); ClientConnected(client); serverSocket.BeginAccept(new AsyncCallback(HandleIncomingConnection), serverSocket); } else { ConnectionBlocked((IPEndPoint)oldSocket.RemoteEndPoint); } } catch { } }
/// <summary> /// Receives and processes data from a socket. /// It triggers the message received event in /// case the client pressed the return key. /// </summary> private void ReceiveData(IAsyncResult result) { try { Socket clientSocket = (Socket)result.AsyncState; TelnetClient client = GetClientBySocket(clientSocket); int bytesReceived = clientSocket.EndReceive(result); if (bytesReceived == 0) { CloseSocket(clientSocket); serverSocket.BeginAccept(new AsyncCallback(HandleIncomingConnection), serverSocket); } else if (data[0] < 0xF0) { string receivedData = client.GetReceivedData(); // 0x2E = '.', 0x0D = carriage return, 0x0A = new line if ((data[0] == 0x2E && data[1] == 0x0D && receivedData.Length == 0) || (data[0] == 0x0D)) { //sendMessageToSocket(clientSocket, "\u001B[1J\u001B[H"); MessageReceived(client, client.GetReceivedData()); client.resetReceivedData(); } else { // 0x08 => backspace character if (data[0] == 0x08 || data[0] == 0x7f) { if (receivedData.Length > 0) { client.RemoveLastCharacterReceived(); SendBytesToSocket(clientSocket, new byte[] { 0x08, 0x20, 0x08 }); } else { clientSocket.BeginReceive(data, 0, dataSize, SocketFlags.None, new AsyncCallback(ReceiveData), clientSocket); } } // 0x7F => delete character else if (data[0] == 0x7F) { clientSocket.BeginReceive(data, 0, dataSize, SocketFlags.None, new AsyncCallback(ReceiveData), clientSocket); } else { client.appendReceivedData(Encoding.ASCII.GetString(data, 0, bytesReceived)); // Echo back the received character // if client is not writing any password if (client.GetCurrentStatus() != EClientStatus.Authenticating) { SendBytesToSocket(clientSocket, new byte[] { data[0] }); } // Echo back asterisks if client is // writing a password else { SendMessageToSocket(clientSocket, "*"); } clientSocket.BeginReceive(data, 0, dataSize, SocketFlags.None, new AsyncCallback(ReceiveData), clientSocket); } } } else { clientSocket.BeginReceive(data, 0, dataSize, SocketFlags.None, new AsyncCallback(ReceiveData), clientSocket); } } catch (ObjectDisposedException) { } }