diff options
-rw-r--r-- | x11vnc/README | 100 | ||||
-rw-r--r-- | x11vnc/connections.c | 31 | ||||
-rw-r--r-- | x11vnc/connections.h | 1 | ||||
-rw-r--r-- | x11vnc/screen.c | 6 | ||||
-rw-r--r-- | x11vnc/x11vnc.1 | 2 | ||||
-rw-r--r-- | x11vnc/x11vnc.h | 1 | ||||
-rw-r--r-- | x11vnc/x11vnc_defs.c | 3 |
7 files changed, 94 insertions, 50 deletions
diff --git a/x11vnc/README b/x11vnc/README index 0ba8bb1..216af03 100644 --- a/x11vnc/README +++ b/x11vnc/README @@ -2,7 +2,7 @@ Copyright (C) 2002-2009 Karl J. Runge <runge@karlrunge.com> All rights reserved. -x11vnc README file Date: Sun Mar 15 18:06:19 EDT 2009 +x11vnc README file Date: Tue Mar 31 23:24:00 EDT 2009 The following information is taken from these URLs: @@ -586,12 +586,12 @@ vncviewer -via $host localhost:0 # must be TightVNC vncviewer. SourceForge.net. I use libvncserver for all of the VNC aspects; I couldn't have done without it. The full source code may be found and downloaded (either file-release tarball or CVS tree) from the above - link. As of Dec 2008, the [91]x11vnc-0.9.6.tar.gz source package is - released (recommended download). The [92]x11vnc 0.9.6 release notes. + link. As of Mar 2009, the [91]x11vnc-0.9.7.tar.gz source package is + released (recommended download). The [92]x11vnc 0.9.7 release notes. The x11vnc package is the subset of the libvncserver package needed to build the x11vnc program. Also, you can get a copy of my latest, - bleeding edge [93]x11vnc-0.9.7.tar.gz tarball to build the most up to + bleeding edge [93]x11vnc-0.9.8.tar.gz tarball to build the most up to date one. Precompiled Binaries/Packages: See the [94]FAQ below for information @@ -629,13 +629,13 @@ vncviewer -via $host localhost:0 # must be TightVNC vncviewer. them by default.) If your OS has libjpeg.so and libz.so in standard locations you can - build as follows (example given for the 0.9.6 release of x11vnc: + build as follows (example given for the 0.9.7 release of x11vnc: replace with the version you downloaded): (un-tar the x11vnc+libvncserver tarball) -# gzip -dc x11vnc-0.9.6.tar.gz | tar -xvf - +# gzip -dc x11vnc-0.9.7.tar.gz | tar -xvf - (cd to the source directory) -# cd x11vnc-0.9.6 +# cd x11vnc-0.9.7 (run configure and then run make) # ./configure @@ -877,13 +877,13 @@ make I'd appreciate any additional testing very much. Thanks to those who suggested features and helped beta test x11vnc - 0.9.6 released in Dec 2008! + 0.9.7 released in Mar 2009! - Please help test and debug the 0.9.7 version for release sometime in - Spring 2009. + Please help test and debug the 0.9.8 version for release sometime in + Summer 2009. - The version 0.9.7 beta tarball is kept here: - [114]x11vnc-0.9.7.tar.gz + The version 0.9.8 beta tarball is kept here: + [114]x11vnc-0.9.8.tar.gz There are also some Linux, Solaris, Mac OS X, and other OS test binaries [115]here. Please kick the tires and report bugs, performance @@ -900,7 +900,11 @@ make Encryption Plugin' settings panel.) - Here are some features that will appear in the 0.9.7 release: + Here are some features that will appear in the 0.9.8 release: + * Coming Soon! + + + Here are some features that appeared in the 0.9.7 release: * Support for polling Linux Virtual Terminals (also called virtual consoles) directly instead of using /dev/fb. The option to use is, for example, "-rawfb vt2" for Virtual Terminal 2, etc. In this @@ -1350,34 +1354,44 @@ LAY activity changes most of the screen (e.g. moving or iconifying a large window) there is a delay of 0.5-1 sec while x11vnc reads the changed regions in. + A slow framebuffer read rate will often be the performance + bottleneck on a fast LAN (whereas on slower links the reduced + network bandwidth becomes the bottleneck.) Note: A quick way to get a 2X speedup of this for x11vnc is to - switch from depth 24 (32bpp) to depth 16 (16bpp). You get a 4X - speedup going to 8bpp, but the lack of color cells is usually - unacceptable. + switch your X server from depth 24 (32bpp) to depth 16 (16bpp). + You get a 4X speedup going to 8bpp, but the lack of color cells is + usually unacceptable. To get a sense of the read and write speeds of your video card, - you can run benchmarks like: x11perf -getimage500, x11perf - -putimage500, x11perf -shmput500 and for XFree86 displays with - direct graphics access the dga command (press "b" to run the + you can run benchmarks like: "x11perf -getimage500", "x11perf + -putimage500", "x11perf -shmput500" and for XFree86 displays with + direct graphics access the "dga" command (press "b" to run the benchmark and then after a few seconds press "q" to quit). Even - this "dd if=/dev/fb0 of=/dev/null" often gives a good estimate. We - have seen a few cases where the hardware fb read speed is greater - than 65 MB/sec: on high end graphics workstations from SGI and - Sun, and also from a Linux user using nvidia proprietary drivers - for his nvidia video card. Update 2008: thankfully, these sped up - drivers are becoming more common on Linux and *BSD systems and - that makes x11vnc run somewhat more quickly. + this "dd if=/dev/fb0 of=/dev/null" often gives a good estimate. + x11vnc also prints out its estimate: + 28/02/2009 11:11:07 Autoprobing TCP port + 28/02/2009 11:11:07 Autoprobing selected port 5900 + 28/02/2009 11:11:08 fb read rate: 10 MB/sec + 28/02/2009 11:11:08 screen setup finished. + We have seen a few cases where the hardware fb read speed is + greater than 65 MB/sec: on high end graphics workstations from SGI + and Sun, and also from a Linux user using nvidia proprietary + drivers for his nvidia video card. Update 2008: thankfully, these + sped up drivers are becoming more common on Linux and *BSD systems + and that makes x11vnc run somewhat more quickly. Sometimes they + have a read rate of over 400 MB/sec. On XFree86/Xorg it is actually possible to increase the framebuffer read speed considerably (10-100 times) by using the Shadow Framebuffer (a copy of the framebuffer is kept in main memory and this can be read much more quickly). To do this one puts the line Option "ShadowFB" "true" in the Device section of the /etc/X11/XF86Config or /etc/X11/xorg.conf file. Note that this - disables 2D acceleration at the physical display and so likely - defeats the purpose. Nevertheless this could be handy in some - circumstances, e.g. if the slower speed while sitting at the - physical display was acceptable (this seems to be true for most - video cards these days). Unfortunately it does not seem shadowfb - can be turned on and off dynamically... + disables 2D acceleration at the physical display and so that might + be unacceptable if one plays games, etc. on the machine's local + display. Nevertheless this could be handy in some circumstances, + e.g. if the slower speed while sitting at the physical display was + acceptable (this seems to be true for most video cards these + days). Unfortunately it does not seem shadowfb can be turned on + and off dynamically... Another amusing thing one can do is use Xvfb as the X server, e.g. "xinit $HOME/.xinitrc -- /usr/X11R6/bin/Xvfb :1 -screen 0 1024x768x16" x11vnc can poll Xvfb efficiently via main memory. @@ -1512,9 +1526,9 @@ References 88. http://www.karlrunge.com/x11vnc/faq.html#faq-ssl-tunnel-int 89. http://www.karlrunge.com/x11vnc/ssvnc.html 90. http://sourceforge.net/projects/libvncserver/ - 91. http://sourceforge.net/project/showfiles.php?group_id=32584&package_id=119006&release_id=646288 - 92. http://sourceforge.net/project/shownotes.php?release_id=646288&group_id=32584 - 93. http://x11vnc.sourceforge.net/dev/x11vnc-0.9.7.tar.gz + 91. http://sourceforge.net/project/showfiles.php?group_id=32584&package_id=119006&release_id=672184 + 92. http://sourceforge.net/project/shownotes.php?release_id=672184&group_id=32584 + 93. http://x11vnc.sourceforge.net/dev/x11vnc-0.9.8.tar.gz 94. http://www.karlrunge.com/x11vnc/faq.html#faq-binaries 95. http://www.tightvnc.com/download.html 96. http://www.realvnc.com/products/free/4.1/download.html @@ -1535,7 +1549,7 @@ References 111. http://www.karlrunge.com/x11vnc/faq.html#faq-solaris251build 112. http://www.karlrunge.com/x11vnc/faq.html#faq-macosx 113. http://www.karlrunge.com/x11vnc/faq.html#faq-ssl-tunnel-int - 114. http://x11vnc.sourceforge.net/dev/x11vnc-0.9.7.tar.gz + 114. http://x11vnc.sourceforge.net/dev/x11vnc-0.9.8.tar.gz 115. http://www.karlrunge.com/x11vnc/bins 116. mailto:xvml@karlrunge.com 117. http://www.karlrunge.com/x11vnc/faq.html#faq-ssl-tunnel-int @@ -6344,15 +6358,15 @@ EndSection 6200) x11vnc and [549]SSVNC, both TurboVNC enabled, were able to sustain 13.5 frames/sec (fps) and 15 Megapixels/sec using the VirtualGL supplied OpenGL benchmark program glxspheres. VirtualGL on - higher-end hardware can sustain [550]23-30 fps with the glxspheres + higher-end hardware can sustain [550]20-30 fps with the glxspheres benchmark. Potential Slowdown: As we describe [551]elsewhere, unless you use x11vnc with an X server using, say, NVidia proprietary drivers (or a virtual X server like Xvfb or Xdummy, or in ShadowFB mode), then the - read rate from the graphics card can rather slow (e.g. 10 MB/sec) and - becomes the bottleneck when using x11vnc over fast networks. Note that - all of Xorg's drivers currently (2009) have slow read rates (only + read rate from the graphics card can be rather slow (e.g. 10 MB/sec) + and becomes the bottleneck when using x11vnc over fast networks. Note + that all of Xorg's drivers currently (2009) have slow read rates (only proprietary drivers appear to have optimized reads.) So under these (more or less typical) conditions, the speed @@ -9678,7 +9692,7 @@ ev contain very large "case statements" (over 100 cases) that on some platforms can take a very long time to compile (in extreme cases over an hour). However on 32bit Linux with intel/amd processor and gcc - these files usually take less then 10 seconds to compile. For 64bit + these files usually take less than 10 seconds to compile. For 64bit systems using gcc the problem appears to be much worse. The two files with the large number of cases, remote.c and x11vnc.c, @@ -12500,7 +12514,7 @@ x11vnc: a VNC server for real X displays Here are all of x11vnc command line options: % x11vnc -opts (see below for -help long descriptions) -x11vnc: allow VNC connections to real X11 displays. 0.9.7 lastmod: 2009-03-15 +x11vnc: allow VNC connections to real X11 displays. 0.9.8 lastmod: 2009-03-30 x11vnc options: -display disp -auth file -N @@ -12625,7 +12639,7 @@ libvncserver-tight-extension options: % x11vnc -help -x11vnc: allow VNC connections to real X11 displays. 0.9.7 lastmod: 2009-03-15 +x11vnc: allow VNC connections to real X11 displays. 0.9.8 lastmod: 2009-03-30 (type "x11vnc -opts" to just list the options.) diff --git a/x11vnc/connections.c b/x11vnc/connections.c index f6481e1..8321d14 100644 --- a/x11vnc/connections.c +++ b/x11vnc/connections.c @@ -91,6 +91,7 @@ int accept_client(rfbClientPtr client); int run_user_command(char *cmd, rfbClientPtr client, char *mode, char *input, int len, FILE *output); int check_access(char *addr); +void client_set_net(rfbClientPtr client); static rfbClientPtr *client_match(char *str); static void free_client_data(rfbClientPtr client); @@ -138,6 +139,7 @@ char *list_clients(void) { iter = rfbGetClientIterator(screen); while( (cl = rfbClientIteratorNext(iter)) ) { + client_set_net(cl); count++; } rfbReleaseClientIterator(iter); @@ -156,6 +158,7 @@ char *list_clients(void) { iter = rfbGetClientIterator(screen); while( (cl = rfbClientIteratorNext(iter)) ) { ClientData *cd = (ClientData *) cl->clientData; + if (! cd) { continue; } @@ -411,6 +414,7 @@ int run_user_command(char *cmd, rfbClientPtr client, char *mode, char *input, char str[100]; int rc, ok; ClientData *cd = NULL; + client_set_net(client); if (client != NULL) { cd = (ClientData *) client->clientData; addr = client->host; @@ -2897,6 +2901,24 @@ void client_gone_chat_helper(rfbClientPtr client) { chat_window_client = NULL; } +void client_set_net(rfbClientPtr client) { + ClientData *cd; + if (client == NULL) { + return; + } + cd = (ClientData *) client->clientData; + if (cd == NULL) { + return; + } + if (cd->client_port < 0) { + double dt = dnow(); + cd->client_port = get_remote_port(client->sock); + cd->server_port = get_local_port(client->sock); + cd->server_ip = get_local_host(client->sock); + cd->hostname = ip2host(client->host); + rfbLog("client_set_net: %s %.4f\n", client->host, dnow() - dt); + } +} /* * libvncserver callback for when a new client connects */ @@ -2950,10 +2972,8 @@ enum rfbNewClientAction new_client(rfbClientPtr client) { client->clientData = (void *) calloc(sizeof(ClientData), 1); cd = (ClientData *) client->clientData; - cd->client_port = get_remote_port(client->sock); - cd->server_port = get_local_port(client->sock); - cd->server_ip = get_local_host(client->sock); - cd->hostname = ip2host(client->host); + /* see client_set_net() we delay the DNS lookups during handshake */ + cd->client_port = -1; cd->username = strdup(""); cd->unixname = strdup(""); @@ -3026,7 +3046,7 @@ enum rfbNewClientAction new_client(rfbClientPtr client) { install_padded_fb(pad_geometry); } - cd->timer = dnow(); + cd->timer = last_new_client = dnow(); cd->send_cmp_rate = 0.0; cd->send_raw_rate = 0.0; cd->latency = 0.0; @@ -3347,6 +3367,7 @@ void check_new_clients(void) { ClientData *cd = (ClientData *) cl->clientData; char *s; + client_set_net(cl); if (! cd) { continue; } diff --git a/x11vnc/connections.h b/x11vnc/connections.h index 50c2f8d..5f64ab6 100644 --- a/x11vnc/connections.h +++ b/x11vnc/connections.h @@ -70,5 +70,6 @@ extern int accept_client(rfbClientPtr client); extern int run_user_command(char *cmd, rfbClientPtr client, char *mode, char *input, int len, FILE *output); extern int check_access(char *addr); +extern void client_set_net(rfbClientPtr client); #endif /* _X11VNC_CONNECTIONS_H */ diff --git a/x11vnc/screen.c b/x11vnc/screen.c index fbf1b95..afd6c2f 100644 --- a/x11vnc/screen.c +++ b/x11vnc/screen.c @@ -3858,6 +3858,9 @@ void watch_loop(void) { } else { rfbPE(-1); } + if (x11vnc_current < last_new_client + 0.5) { + urgent_update = 1; + } unixpw_in_rfbPE = 0; @@ -3992,6 +3995,9 @@ void watch_loop(void) { #endif continue; } + if (x11vnc_current < last_new_client + 0.5 && !all_clients_initialized()) { + continue; + } if (button_mask && (!show_dragging || pointer_mode == 0)) { /* diff --git a/x11vnc/x11vnc.1 b/x11vnc/x11vnc.1 index b042633..8b54664 100644 --- a/x11vnc/x11vnc.1 +++ b/x11vnc/x11vnc.1 @@ -2,7 +2,7 @@ .TH X11VNC "1" "March 2009" "x11vnc " "User Commands" .SH NAME x11vnc - allow VNC connections to real X11 displays - version: 0.9.7, lastmod: 2009-03-15 + version: 0.9.8, lastmod: 2009-03-30 .SH SYNOPSIS .B x11vnc [OPTION]... diff --git a/x11vnc/x11vnc.h b/x11vnc/x11vnc.h index e5ffa2d..805d889 100644 --- a/x11vnc/x11vnc.h +++ b/x11vnc/x11vnc.h @@ -550,6 +550,7 @@ extern int hack_val; extern rfbClientPtr last_pointer_client; extern rfbClientPtr latest_client; extern double last_client_gone; +extern double last_new_client; extern int waited_for_client; extern int findcreatedisplay; diff --git a/x11vnc/x11vnc_defs.c b/x11vnc/x11vnc_defs.c index 97ec5e0..b9d0ad9 100644 --- a/x11vnc/x11vnc_defs.c +++ b/x11vnc/x11vnc_defs.c @@ -47,7 +47,7 @@ int xtrap_base_event_type = 0; int xdamage_base_event_type = 0; /* date +'lastmod: %Y-%m-%d' */ -char lastmod[] = "0.9.7 lastmod: 2009-03-15"; +char lastmod[] = "0.9.8 lastmod: 2009-03-30"; /* X display info */ @@ -187,6 +187,7 @@ int hack_val = 0; rfbClientPtr last_pointer_client = NULL; rfbClientPtr latest_client = NULL; double last_client_gone = 0.0; +double last_new_client = 0.0; int waited_for_client = 0; int findcreatedisplay = 0; |