Minimalna implementacija VNC (RFB) servera i klijenta za Windows, napisana u čistom C-u (bez spoljnih biblioteka, samo Win32 API).
- vnc-server.exe — hvata sadržaj ekrana (GDI) i servira ga preko RFB protokola. Namenjen je da radi kao Windows servis koji se pokreće sam sa sistemom.
- vnc-viewer.exe — konzolni alat koji se povezuje na server i prikazuje primljeni ekran u GUI prozoru, u realnom vremenu.
Podržane platforme: Windows 7 i noviji (x64).
- Build
- vnc-server — upotreba
- vnc-viewer — upotreba
- Kako radi (arhitektura)
- Bezbednost
- Poznata ograničenja
- Struktura projekta
Potrebno:
- CMake 3.20+
- MinGW-w64 (GCC) toolchain u
PATH-u (testirano sa MinGW-w64 UCRT)
.\build.ps1Skripta konfiguriše i builduje projekat (MinGW Makefiles generator) u
build\ direktorijum. Rezultat:
build\vnc-server.exe
build\vnc-viewer.exe
Ručno, bez skripte:
cmake -S . -B build -G "MinGW Makefiles"
cmake --build buildvnc-server.exe install [port] instalira Windows servis (podrazumevano 5900)
vnc-server.exe uninstall uklanja servis
vnc-server.exe start pokreće instaliran servis
vnc-server.exe stop zaustavlja pokrenut servis
vnc-server.exe console [port] pokreće server u konzoli, u prednjem planu
(za testiranje; Ctrl+C za izlaz)
install, uninstall, start i stop zahtevaju administratorska prava
(pokrenuti konzolu preko "Run as Administrator").
# iz konzole pokrenute kao Administrator
.\vnc-server.exe install 5900
.\vnc-server.exe startServis se od tada pokreće automatski sa Windows-om (SERVICE_AUTO_START).
Status i kontrolu je moguće pratiti i standardnim Windows alatima:
sc query MiniVncServer
services.msc.\vnc-server.exe stop
.\vnc-server.exe uninstallPošto servis nema konzolu, sve poruke se pišu u fajl:
%ProgramData%\MiniVncServer\service.log
Isti fajl se koristi i u console režimu (uz dodatan ispis na ekran).
vnc-viewer.exe <ip> <port>
Primer:
.\vnc-viewer.exe 192.168.1.50 5900Program se pokreće kao konzolna aplikacija — prvo u konzoli ispisuje tok RFB handshake-a, a zatim otvara GUI prozor sa uživo slikom ekrana. Prozor se osvežava u pozadinskoj niti dok je konekcija aktivna; zatvaranjem prozora (X dugme) veza se uredno prekida.
vnc-viewer je generički RFB 3.8 klijent (bez autentifikacije, Raw
enkoding) — može da se poveže i na neki drugi RFB server koji ispunjava iste
uslove, ne samo na vnc-server.exe iz ovog projekta.
common/ deljeni kod (Winsock helperi, RFB konstante, logger)
server/
main.c parsiranje komandne linije, biranje režima rada
service.c integracija sa Windows Service Control Manager-om (SCM)
listener.c TCP accept petlja (jedan klijent u datom trenutku)
rfb_server.c RFB protokol - server strana (handshake + petlja poruka)
capture.c snimanje ekrana preko GDI-ja (BitBlt -> DIB sekcija)
viewer/
main.c parsiranje argumenata, orkestracija mrežne i GUI niti
rfb_client.c RFB protokol - klijentska strana
window.c Win32 prozor i iscrtavanje (StretchDIBits)
framebuffer.c lokalni bafer piksela, sa CRITICAL_SECTION zaključavanjem
Tok jedne sesije:
- Viewer se poveže i odradi RFB handshake (verzija → security → init).
- Server pri handshake-u snimi trenutne dimenzije ekrana (GDI DIB sekcija se drži otvorena kroz celu sesiju, bez ponovne alokacije po frejmu).
- Viewer u petlji šalje
FramebufferUpdateRequest; server na svaki zahtev snimi trenutni ekran i pošalje ga nazad kao jedan Raw pravougaonik koji pokriva ceo ekran. - Viewer prima podatke u pozadinskoj niti i poziva
InvalidateRectda GUI nit ponovo iscrta prozor.
Server dodatno prepoznaje i bezbedno odbacuje standardne klijent→server
poruke (SetPixelFormat, SetEncodings, KeyEvent, PointerEvent,
ClientCutText) — to znači da se na njega mogu povezati i drugi VNC
vieveri (npr. TigerVNC), ali samo za pregled ekrana (unos sa tastature/
miša se ne prosleđuje).
- Security type je None (bez lozinke). Bilo ko ko može da dopre do porta 5900 (TCP) na mreži može da vidi ekran.
- Nema šifrovanja saobraćaja.
- Nema autentifikacije korisnika.
Ovo NIJE bezbedno za izlaganje internetu. Koristiti isključivo u poverljivim, izolovanim mrežama, ili iza VPN-a / SSH tunela / firewall pravila koja ograničavaju pristup portu na poznate IP adrese.
- Samo Raw enkoding (nema kompresije) — svaki frejm nosi punu veličinu ekrana; osvežavanje je ograničeno na ~33 fps u vieweru radi uštede CPU-a i mreže.
- Nema praćenja "prljavih" regiona — svaki zahtev šalje ceo ekran, čak i kad se ništa nije promenilo.
- Nema prosleđivanja unosa (tastatura/miš) — isključivo pregled (view-only).
- Nema autentifikacije (security type None).
- Samo IPv4.
- Server opslužuje jednog klijenta u datom trenutku; sledeći klijent se prihvata tek kad se prethodni otkači.
CMakeLists.txt definicija build-a za oba izvršna fajla
build.ps1 pomoćna skripta za konfigurisanje i build
common/ deljeni kod (server + viewer)
server/ izvorni kod vnc-server.exe
viewer/ izvorni kod vnc-viewer.exe