The RDP client in this application is currently a placeholder implementation and does NOT actually connect to RDP servers. All methods return Ok(()) but don't perform any real operations.
When you connect to an RDP server, the application:
- ✅ Creates a connection profile
- ✅ Shows a tab with the RDP icon
- ❌ Does NOT actually connect to the RDP server
- ❌ Does NOT receive any frame data
- ❌ Renders an empty/black canvas
# Install rdesktop
sudo apt install rdesktop
# Connect to your server
rdesktop -u USERNAME -p PASSWORD 10.8.64.76:3389# Install FreeRDP
sudo apt install freerdp2-x11
# Connect to your server
xfreerdp /u:USERNAME /p:PASSWORD /v:10.8.64.76:3389 /size:1920x1080# Install Remmina
sudo apt install remmina remmina-plugin-rdp
# Then launch Remmina from applications and create a new RDP connection# Check if xrdp is running
sudo systemctl status xrdp
# Check if port 3389 is listening
sudo netstat -tlnp | grep 3389
# or
sudo ss -tlnp | grep 3389
# Test connection from command line
telnet 10.8.64.76 3389Located in src-tauri/src/rdp/:
-
client.rs - Replace placeholder with actual IronRDP implementation:
- Initialize IronRDP client
- Perform RDP handshake (Connection Initiation, Basic Settings Exchange)
- Handle NLA (Network Level Authentication) if required
- Receive and process bitmap updates
- Send keyboard/mouse input events
-
manager.rs - Update frame reader:
- Actually poll for frame updates from IronRDP
- Convert RDP bitmap data to RGBA format
- Emit frames to frontend via Tauri events
-
framebuffer.rs - Process RDP-specific formats:
- Handle RDP bitmap compression
- Convert various RDP pixel formats to RGBA
Located in src/components/rdp/:
- RdpViewer.tsx - Currently implemented and should work once backend sends frames
src-tauri/src/rdp/
├── mod.rs - Module exports and types
├── client.rs - ⚠️ PLACEHOLDER - RDP client stub
├── manager.rs - ⚠️ INCOMPLETE - No actual frame reading
├── input.rs - Input event types (complete)
└── framebuffer.rs - Basic framebuffer (needs RDP-specific handling)
[dependencies]
ironrdp = "0.3.0" # RDP protocol library (NOT BEING USED YET)- Study IronRDP examples: Check the
ironrdpcrate documentation - Implement connection sequence: RDP handshake, NLA, capabilities exchange
- Handle bitmap updates: Process and decode RDP graphics orders
- Implement input forwarding: Send mouse/keyboard events to RDP session
- Test with your xrdp server: Iterate on implementation
Since IronRDP is complex, consider:
- Start with VNC - The VNC implementation is more complete and simpler
- Study the VNC implementation in
src-tauri/src/vnc/as a reference - Follow IronRDP examples from their repository
- Implement in phases:
- Phase 1: Basic connection and authentication
- Phase 2: Receive and display frames
- Phase 3: Send input events
- Phase 4: Handle disconnections and errors
If you have a VNC server available, that implementation is more complete:
# Test VNC connection
vncviewer 10.8.64.76:5900The VNC implementation in this app actually connects and should display frames (though framebuffer processing may need refinement).