TightVNC 2.0.4 Connection Closed问题

原创 2011年08月25日 11:01:14

症状(SYMPTOM):

 服务端tvnserver-2.0.4,客户端tvnviewer-1.5.4,采用vs2010编译,操作系统为WinXP SP2/SP3。客户端在连接并且通过验证后报Connection Closed。该问题与验证方式、服务端屏幕分辨率等无关。该症状不是必然发生在每台机器上,经测试,部分环境下不会出现,但没有得到精确地规律。

原因(CAUSE):

 经查,该症状是由于服务器在验证客户端后为客户端创建桌面对象时,返回NULL,服务器主动断开了客户端的连接所致,见RfbClient.cpp文件的RfbClient::execute函数,代码如下:
 void RfbClient::execute(){
   ...
   m_desktop = m_extAuthListener->onClientAuth(this);
   ...
  }
 RfbClient是RFB协议的客户端类,服务器为每个RFB客户端创建一个RfbClient对象,每个对象有一个工作线程,RfbClient::execute是工作线程方法。m_desktop返回NULL,导致抛出异常,服务器主动关闭连接。继续跟踪,调用路径(调用栈)如下:
  Thread::threadProc()
  RfbClient::execute()---(rfb-sconn工程的RfbClient.cpp)
  RfbClientManager::onClientAuth()---(RfbClientManager.cpp)
  WinDesktop::WinDesktop()---(WinDesktop.cpp)
  WindowsUserInput::WindowsUserInput(ClipboardListener *clipboardListener,bool ctrlAltDelEnabled)---(WindowsUserInput.cpp)
  KeyEvent::KeyEvent(bool ctrlAltDelEnabled)---(KeyEvent.cpp)
  InputInjector::InputInjector(bool ctrlAltDelEnabled)---(InputInjector.cpp)
  void InputInjector::resetModifiers()---(win-system工程的InputInjector.cpp)
  void InputInjector::injectKeyEvent(BYTE vkCode, bool release, bool extended)---(win-system工程的InputInjector.cpp)
  最后在inputInjector::resetModifiers方法中执行injectKeyEvent(VK_LWIN, true);语句产生异常,inputInjector::resetModifiers方法代码如下:
  void InputInjector::resetModifiers()
 {
   injectKeyEvent(VK_MENU, true);
   injectKeyEvent(VK_LMENU, true);
   injectKeyEvent(VK_RMENU, true);
   injectKeyEvent(VK_SHIFT, true);
   injectKeyEvent(VK_LSHIFT, true);
   injectKeyEvent(VK_RSHIFT, true);
   injectKeyEvent(VK_CONTROL, true);
   injectKeyEvent(VK_LCONTROL, true);
   injectKeyEvent(VK_RCONTROL, true);
   injectKeyEvent(VK_LWIN, true);///<此处产生异常
   injectKeyEvent(VK_RWIN, true);
   injectKeyEvent(VK_DELETE, true);
 }
 InputInjector::injectKeyEvent代码如下:
  void InputInjector::injectKeyEvent(BYTE vkCode, bool release, bool extended){
   ...
   INPUT keyEvent = {0};

    keyEvent.type = INPUT_KEYBOARD;
    keyEvent.ki.wVk = vkCode;
    keyEvent.ki.wScan = MapVirtualKey(vkCode, 0);

    if (release) {
      keyEvent.ki.dwFlags = KEYEVENTF_KEYUP;
    }

    if (extended) {
      keyEvent.ki.dwFlags |= KEYEVENTF_EXTENDEDKEY;
    }
   if (SendInput(1, &keyEvent, sizeof(keyEvent)) == 0) {///<此处执行失败,GetLastError返回1350
       DWORD errCode = GetLastError();
       if (errCode != ERROR_SUCCESS) {
         throw SystemException(errCode);///<执行到此处抛出异常
       } else {
         throw Exception(_T("SendInput() function failed"));
       }
     }
   }
   ...
  }
  SendInput函数模拟VK_LWIN(左边窗口键)失败,返回NULL。GetLastError返回1350,为“无法在与安全性无关联的对象上运行安全性操作。”。
 为查明SendInput函数为何不能模拟VK_LWIN键,特用vs2010写了2个测试工程,一个是控制台应用程序,一个是MFC基于对话框的应用程序。控制台应用程序执行SendInput返回0,GetLastError返回错误码0;MFC程序执行SendInput返回0,GetLastError返回错误码127。与TightVNC中的返回码都不一致。时间关系,未进一步分析SendInput函数失败的真正原因。
 
解决方案(SOLUTION):
 
 直接注释掉InputInjector::resetModifiers函数中的模拟VK_LWIN的代码,修改后的代码为:
 void InputInjector::resetModifiers()
 {
   injectKeyEvent(VK_MENU, true);
   injectKeyEvent(VK_LMENU, true);
   injectKeyEvent(VK_RMENU, true);
   injectKeyEvent(VK_SHIFT, true);
   injectKeyEvent(VK_LSHIFT, true);
   injectKeyEvent(VK_RSHIFT, true);
   injectKeyEvent(VK_CONTROL, true);
   injectKeyEvent(VK_LCONTROL, true);
   injectKeyEvent(VK_RCONTROL, true);
   //injectKeyEvent(VK_LWIN, true);///<此处产生异常
   //injectKeyEvent(VK_RWIN, true);
   injectKeyEvent(VK_DELETE, true);
 }
 
 重新编译win-system工程和tvnserver工程,问题得到解决。
 
  这只是个临时解决办法,最终的解决办法是找出SendInput函数失败的原因,然后寻找解决之道。

  

VNC Viewer:The connection was refused by host computer

VNC Viewer:The connection was refused by host computerCentOS 6.5 修改IP后VNC链接失败,提示:The connection was ...

vnc登录时connection refused(10061)解决方法

问题:当你在windows上连接linux上vnc服务器时,点击connect后弹出connect:connect refused(10061)警告框时连接被拒绝。 首先,如果你的VNC配置没有问题...

关于Connection Closed Gracefully问题

Connection Closed Gracefully 温和的关闭连接 Many Indy users are annoyed by the EIdConnClosedGracefully exce...

问题:No operations allowed after connection closed.

关于com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after ...

ssh问题:ssh_exchange_identification: Connection closed by remote host

启动sshd服务时,报如下的错误信息: 引用 # /usr/local/sbin/sshd Could not load host key: /usr/local/etc/ssh/ssh_h...
  • dssxk
  • dssxk
  • 2011年09月09日 10:02
  • 2779

TightVNC 2.0.4在VC2010下的编译

TightVNC 2.0.4在VC2010下的编译 TightVNC 2.0.4版本由服务端tvnserver-2.0.4和客户端tvnviewer-1.5.4组成。可从http://www.tig...

tightvnc-2.0.4

  • 2011年10月14日 12:26
  • 647KB
  • 下载

Oracle 11gR2 RAC 数据库不能连接(ORA-12537: TNS:connection closed)的解决

Oracle 11gR2 RAC 数据库不能连接(ORA-12537: TNS:connection closed)的解决   [oracle@rac01 ~]$ sqlplus /nolog ...
  • gyming
  • gyming
  • 2012年08月29日 21:29
  • 9683

ssh 提示Connection closed by * 的解决方案

ssh 提示Connection closed by * 的解决方案
  • lile777
  • lile777
  • 2017年06月20日 17:19
  • 1151

SSH无法连接:Connection closed by foreign host

Connection closed by foreign host 解决方法 连接管理终端,执行如下命令: 最后重启sshd的路径不一定和教程一样,要找到自己的sshd路径进行重启。...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:TightVNC 2.0.4 Connection Closed问题
举报原因:
原因补充:

(最多只允许输入30个字)