Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in
Toggle navigation
L
libvncserver
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
rasky
libvncserver
Commits
fb53d481
Commit
fb53d481
authored
Sep 27, 2001
by
dscho
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
docu and cursors in examples.
parent
5c3eae92
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
116 additions
and
48 deletions
+116
-48
README
README
+74
-3
TODO
TODO
+3
-1
example.c
example.c
+23
-23
main.c
main.c
+14
-20
rfb.h
rfb.h
+2
-1
No files found.
README
View file @
fb53d481
...
...
@@ -5,8 +5,9 @@ What is it?
-----------
VNC is set of programs using the RFB (Remote Frame Buffer) protocol. They
are designed to "export" a frame buffer via net. It is already in wide use
for administration, but it is not that easy to make a server yourself.
are designed to "export" a frame buffer via net (if you don't know VNC, I
suggest you read "Basics" below). It is already in wide use for
administration, but it is not that easy to program a server yourself.
This has been changed by LibVNCServer.
...
...
@@ -175,7 +176,77 @@ History
LibVNCServer is based on Tridia VNC and OSXvnc, which in turn are based on
the original code from ORL/AT&T.
VNC fascinated me from t
When I began hacking with computers, my first interest was speed. So, when I
got around assembler, I programmed the floppy to do much of the work, because
it's clock rate was higher than that of my C64. This was my first experience
with client/server techniques.
When I came around Xwindows (much later), I was at once intrigued by the
elegance of such connectedness between the different computers. I used it
a lot - not the least priority lay on games. However, when I tried it over
modem from home, it was no longer that much fun.
When I started working with ASP (Application Service Provider) programs, I
tumbled across Tarantella and Citrix. Being a security fanatic, the idea of
running a server on windows didn't appeal to me, so Citrix went down the
basket. However, Tarantella has it's own problems (security as well as the
high price). But at the same time somebody told me about this "great little
administrator's tool" named VNC. Being used to windows programs' sizes, the
surprise was reciprocal inverse to the size of VNC!
At the same time, the program "rdesktop" (a native Linux client for the
Terminal Services of Windows servers) came to my attention. There where even
works under way to make a protocol converter "rdp2vnc" out of this. However,
my primary goal was a slow connection and rdp2vnc could only speak RRE
encoding, which is not that funny with just 5kB/s. Tim Edmonds, the original
author of rdp2vnc, suggested that I adapt it to Hextile Encoding, which is
better. I first tried that, but had no success at all (crunchy pictures).
Also, I liked the idea of an HTTP server included and possibly other
encodings like the Tight Encodings from Const Kaplinsky. So I started looking
for libraries implementing a VNC server where I could steal what I can't make.
I found some programs based on the demo server from AT&T, which was also the
basis for rdp2vnc (can only speak Raw and RRE encoding). There were some
rumors that GGI has a VNC backend, but I didn't find any code, so probably
there wasn't a working version anyway.
All of a sudden, everything changed: I read on freshmeat that "OSXvnc" was
released. I looked at the code and it was not much of a problem to work out
a simple server - using every functionality there is in Xvnc. It became clear
to me that I *had* to build a library out of it, so everybody can use it.
Every change, every new feature can propagate to every user of it.
It also makes everything easier:
You don't care about the cursor, once set (or use the standard cursor).
You don't care about those sockets. You don't care about encodings.
You just change your frame buffer and inform the library about it. Every once
in a while you call rfbProcessEvents and that's it.
Basics
------
VNC (Virtual network computing) works like this: You set up a server and can
connect to it via vncviewers. The communication uses a protocol named RFB
(Remote Frame Buffer). If the server supports HTTP, you can also connect
using a java enabled browser. In this case, the server sends back a
vncviewer applet with the correct settings.
There exist several encodings for VNC, which are used to compress the regions
which have changed before they are sent to the client. A client need not be
able to understand every encoding, but at least Raw encoding. Which encoding
it understands is negotiated by the RFB protocol.
The following encodings are known to me:
Raw, RRE, CoRRE, Hextile, CopyRect from the original AT&T code and
Tight, ZLib, LastRect, XCursor, RichCursor from Const Kaplinsky et al.
If you are using a modem, you want to try the "new" encodings. Especially
with my 56k modem I like ZLib or Tight with Quality 0. In my tests, it even
beats Tarantella.
There is the possibility to set a password, which is also negotiated by the
RFB protocol, but IT IS NOT SECURE. Anybody sniffing your net can get the
password. You really should tunnel through SSH.
License
-------
...
...
TODO
View file @
fb53d481
...
...
@@ -3,18 +3,20 @@ immediate:
fix bug in http (java) client with big endian server: byte swapping is broken
cursor "smears" sometimes when not using cursor encoding
really support pthreads.
in the works:
-------------
adapt rdp2vnc (rdesktop)
optionally dont draw rich cursors as xcursors
use sraRegion from
rdp2vnc
instead of miregion, because it is much smaller
use sraRegion from
Wez
instead of miregion, because it is much smaller
later:
------
udp
autoconf
rfbCloseClient, rfbConnect, ConnectToTcpAddr
CORBA
translate.c: warning about non 8-bit colourmaps
...
...
example.c
View file @
fb53d481
...
...
@@ -241,42 +241,42 @@ void MakeRichCursor(rfbScreenInfoPtr rfbScreen)
" xxxxxx "
" xxxxxxxxxxxxxxxxx "
" xxxxxxxxxxxxxxxxxxxxxx "
" xxxxx
xxxxxxxxxxxx
xxxxxxxx "
" xxxxx
xxxxxxxx
xxxxxxxx "
" xxxxxxxxxxxxxxxxxxxxxxxxxxx "
" xxxxxxxxxxxxxxxxxxxxxxxxxxxxx "
" xxxxxxxxxxxxxxxxxxxxxxxxxxxxx "
" xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx "
" xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx "
" xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx "
" xxxxx xxxxxxxxxxx xxxxxxx "
" xxxx xxxxxxxxx xxxxxx "
" xxxxx xxxxxxxxxxx xxxxxxx "
" xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx "
" xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx "
" xxxxxxxxxxxx xxxxxxxxxxxxxxx "
" xxxxxxxxxxxxxxxxxxxxxxxxxxxx "
" xxxxxxxxxxxxxxxxxxxxxxxxxxxx "
" xxxxxxxxxxxxxxxxxxxxxxxxxxx "
" xxxxxxxxxxxxxxxxxxxxxxxxxx "
" xxxxxxxxxxxxxxxxxxxxxxxxxx "
" xxxxxxxxxxxxxxxxxxxxxxxx "
" xxxxxxxxxxxxxxxxxxxxxx "
" xxxxxxxxxxx xxxxxxxxxxxxxx "
" xxxxxxxxxx xxxxxxxxxxxx "
" xxxxxxxxx xxxxxxxxx "
" xxxxxxxxxx xxxxxxxxx "
" xxxxxxxxxxxxxxxxxxx "
"
xxxxxxxxxxxxxxxxx
"
"
xxxxxxxxxxxxxxx
"
" xxxxxxxxxxxxxx
"
"
xxxxxxxxxxxx
"
"
xxxxxxxxxxxx
"
" xx
xxxxxxxxxxx
"
" xxx
xxxxxxxxxxx
"
" xxxx
xxxxxxxxxxx
"
" xxxxxx
x
xxxxxxxxxxxx "
"
xxxxxxxxxxxxxxxxxxx
"
"
xxxxxxxxxxxxxxxxxxx
"
" xxxxxxxxxxxxxx
xxx
"
"
xxxxxxxxxxxxxxx
"
"
xxxx xxxxxxxxxxxxx
"
" xx
x xxxxxxxxxxx
"
" xxx
xxxxxxxxxxx
"
" xxxx
xxxxxxxxxxx
"
" xxxxxx
xxxxxxxxxxxx "
" xxxxxxxxxxxxxxxxxxxxxx "
" xxxxxxxxxxxxxxxx "
" "
;
c
=
rfbScreen
->
cursor
=
rfbMakeXCursor
(
w
,
h
,
bitmap
,
0
);
c
->
xhot
=
2
;
c
->
yhot
=
10
;
c
=
rfbScreen
->
cursor
=
rfbMakeXCursor
(
w
,
h
,
bitmap
,
bitmap
);
c
->
xhot
=
16
;
c
->
yhot
=
24
;
c
->
richSource
=
malloc
(
w
*
h
*
bpp
);
for
(
j
=
0
;
j
<
h
;
j
++
)
{
for
(
i
=
0
;
i
<
w
;
i
++
)
{
c
->
richSource
[
j
*
w
*
bpp
+
i
*
bpp
+
0
]
=
0
;
//
i*0xff/w;
c
->
richSource
[
j
*
w
*
bpp
+
i
*
bpp
+
1
]
=
0
;
c
->
richSource
[
j
*
w
*
bpp
+
i
*
bpp
+
0
]
=
i
*
0xff
/
w
;
c
->
richSource
[
j
*
w
*
bpp
+
i
*
bpp
+
1
]
=
(
i
+
j
)
*
0xff
/
(
w
+
h
)
;
c
->
richSource
[
j
*
w
*
bpp
+
i
*
bpp
+
2
]
=
j
*
0xff
/
h
;
c
->
richSource
[
j
*
w
*
bpp
+
i
*
bpp
+
3
]
=
0
;
}
...
...
main.c
View file @
fb53d481
...
...
@@ -306,29 +306,17 @@ void defaultSetXCutText(char* text, int len, rfbClientPtr cl)
static
rfbCursor
myCursor
=
{
//width: 8, height: 7, xhot: 3, yhot: 3,
width
:
8
,
height
:
7
,
xhot
:
0
,
yhot
:
0
,
//source: "\000\102\044\030\044\102\000",
//mask: "\347\347\176\074\176\347\347",
source
:
"
\000\074\176\146\176\074\000
"
,
mask
:
"
\176\377\377\377\377\377\176
"
,
width
:
8
,
height
:
7
,
xhot
:
3
,
yhot
:
3
,
source
:
"
\000\102\044\030\044\102\000
"
,
mask
:
"
\347\347\176\074\176\347\347
"
,
/*
width: 8, height: 7, xhot: 0, yhot: 0,
source: "\000\074\176\146\176\074\000",
mask: "\176\377\377\377\377\377\176",
*/
foreRed
:
0
,
foreGreen
:
0
,
foreBlue
:
0
,
backRed
:
0xffff
,
backGreen
:
0xffff
,
backBlue
:
0xffff
,
#define D "\000\000\000\000"
#define R "\377\000\000\000"
#define G "\000\377\000\000"
#define B "\000\000\377\000"
#define S "\377\377\000\000"
#define H "\000\377\377\000"
#define C "\377\000\377\000"
richSource
:
0
/*D D D D D D D D
D D R R R R D D
D S S S S S S D
D G G D D G G D
D H H H H H H D
D D B B B B D D
D D D D D D D D*/
};
rfbCursorPtr
defaultGetCursorPtr
(
rfbClientPtr
cl
)
...
...
@@ -435,6 +423,12 @@ rfbScreenInfoPtr rfbGetScreen(int argc,char** argv,
return
(
rfbScreen
);
}
void
rfbScreenCleanup
(
rfbScreenInfoPtr
rfbScreen
)
{
/* TODO */
free
(
rfbScreen
);
}
void
rfbInitServer
(
rfbScreenInfoPtr
rfbScreen
)
{
rfbInitSockets
(
rfbScreen
);
...
...
rfb.h
View file @
fb53d481
...
...
@@ -612,7 +612,8 @@ extern void rfbScreenCleanup(rfbScreenInfoPtr screenInfo);
/* call one of these two functions to service the vnc clients.
usec are the microseconds the select on the fds waits.
if you are using the event loop, set this to some value > 0. */
if you are using the event loop, set this to some value > 0, so the
server doesn't get a high load just by listening. */
extern
void
rfbRunEventLoop
(
rfbScreenInfoPtr
screenInfo
,
long
usec
,
Bool
runInBackground
);
extern
void
rfbProcessEvents
(
rfbScreenInfoPtr
screenInfo
,
long
usec
);
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment