//! this is called before every frame, used for polling for RFB messages void VncServer::preFrame() { const int wait_msec=1; if (m_delay) { usleep(m_delay); } if (m_numClients == 0) { for (size_t i=0; i<m_clientList.size(); ++i) { if (rfbReverseConnection(m_screen, const_cast<char *>(m_clientList[i].host.c_str()), m_clientList[i].port)) { break; } } } rfbCheckFds(m_screen, wait_msec*1000); rfbHttpCheckFds(m_screen); rfbClientIteratorPtr i = rfbGetClientIterator(m_screen); while (rfbClientPtr cl = rfbClientIteratorNext(i)) { if (rfbUpdateClient(cl)) { } } rfbReleaseClientIterator(i); }
void PresentationServer::_initRfbServer(int screenWidth, int screenHeight, const std::string & serverPassword, const std::string & peerHostName /*< für Zertifikatsprüfung */, const std::string & caCertificate, const std::string & host, unsigned short port) { _serverPassword = serverPassword; //Wenn die erfolgreich war dann den Server erstellen, Gr��e = Desktopgr��e _server = rfbGetScreen(0, 0, screenWidth, screenHeight, 8, 3, 4); int buffersize = _server->width * _server->height * (_server->bitsPerPixel / 8); _server->frameBuffer = new char[buffersize]; _server->alwaysShared = false; _server->neverShared = true; //Kein horchen auf neue Verbindungen _server->autoPort = false; _server->port = -1; _server->ipv6port = -1; _server->httpPort = -1; _server->http6Port = -1; //Die globalen Variablen werden zum Weiterreichen des Zustands an upgradeNewClientToTls verwendet. //dieses konstrukt funktioniert natürlich nur wenn es nur eine Instanz dieser Klasse hier gibt... vlt sollte ich die wirklich zu nem Singleton machen oder //natürlich besser das hier anständig implementieren. //... man kriegt echt das Würgen wenn man sich den Code ansieht, den man hier verbrochen hat... g_serverPassword = _serverPassword; g_peerHostName = peerHostName; g_caCertificate = caCertificate; _server->newClientCreationHook = upgradeNewClientToTls; /* Initialize the server */ rfbInitServer(_server); if (!rfbReverseConnection(_server, const_cast<char*> (host.c_str()), port)) { std::cerr << "Failed to connect to " << host << ":" << port << std::endl; throw std::runtime_error(STR_ERR_RFBHOST_UNREACHABLE); } //Starte Timer _tick = std::chrono::high_resolution_clock::now(); }
int main(int argc, char **argv) { //pipe signals signal(SIGINT, close_app); signal(SIGKILL, close_app); signal(SIGILL, close_app); long usec; if(argc > 1) { int i=1; int r; while(i < argc) { if(*argv[i] == '-') { switch(*(argv[i] + 1)) { case 'h': printUsage(argv); exit(0); break; case 'p': i++; strcpy(VNC_PASSWORD,argv[i]); break; case 'f': i++; FB_setDevice(argv[i]); break; case 'z': i++; display_rotate_180=1; break; case 'P': i++; VNC_PORT=atoi(argv[i]); break; case 'r': i++; r = atoi(argv[i]); if (r==0 || r==90 || r==180 || r==270) rotation = r; L("rotating to %d degrees\n",rotation); break; case 's': i++; r=atoi(argv[i]); if (r >= 1 && r <= 150) scaling = r; else scaling = 100; L("scaling to %d%%\n",scaling); break; case 'R': i++; extractReverseHostPort(argv[i]); break; case 'm': i++; if (!strcmp(argv[i],"adb")){ method = ADB; L("ADB display grabber selected\n"); } else if (!strcmp(argv[i],"fb")) { method = FRAMEBUFFER; L("Framebuffer display grabber selected\n"); } else if (!strcmp(argv[i],"gralloc")) { method = GRALLOC; L("Gralloc display grabber selected\n"); } else if (!strcmp(argv[i],"flinger")) { method = FLINGER; L("Flinger display grabber selected\n"); } else { L("Grab method \"%s\" not found, sticking with auto-detection.\n",argv[i]); } break; } } i++; } } L("Initializing grabber method...\n"); initGrabberMethod(); L("Initializing virtual keyboard and touch device...\n"); initInput(); L("Initializing VNC server:\n"); L(" width: %d\n", (int)screenformat.width); L(" height: %d\n", (int)screenformat.height); L(" bpp: %d\n", (int)screenformat.bitsPerPixel); L(" port: %d\n", (int)VNC_PORT); L("Colourmap_rgba=%d:%d:%d:%d lenght=%d:%d:%d:%d\n", screenformat.redShift, screenformat.greenShift, screenformat.blueShift,screenformat.alphaShift, screenformat.redMax,screenformat.greenMax,screenformat.blueMax,screenformat.alphaMax); initVncServer(argc, argv); bindIPCserver(); sendServerStarted(); if (rhost) { rfbClientPtr cl; cl = rfbReverseConnection(vncscr, rhost, rport); if (cl == NULL) { char *str=malloc(255*sizeof(char)); sprintf(str,"~SHOW|Couldn't connect to remote host:\n%s\n",rhost); L("Couldn't connect to remote host: %s\n",rhost); sendMsgToGui(str); free(str); } else { cl->onHold = FALSE; rfbStartOnHoldClient(cl); } } while (1) { usec=(vncscr->deferUpdateTime+standby)*1000; //clock_t start = clock(); rfbProcessEvents(vncscr,usec); if (idle) standby+=2; else standby=2; if (vncscr->clientHead == NULL) { idle=1; standby=50; continue; } update_screen(); //printf ( "%f\n", ( (double)clock() - start )*1000 / CLOCKS_PER_SEC ); } close_app(); }