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函数失败的原因,然后寻找解决之道。

  

关于Connection Closed Gracefully问题

Connection Closed Gracefully 温和的关闭连接 Many Indy users are annoyed by the EIdConnClosedGracefully exce...
  • otherworld
  • otherworld
  • 2008年07月01日 23:39
  • 4337

connection closed gracefully问题

这个问题让我纠结了我好几天。百度了一下,多数说的像这个类似: http://blog.csdn.net/zhongguoren666/article/details/6777402 这个能解决...
  • zhongguoren666
  • zhongguoren666
  • 2011年09月15日 16:32
  • 4880

关于Indy TIdTCPServer控件出现 connection closed gracefully 错误的处理

简单的说,当TidTCPServer调用Read方法接收数据时、或调用Write方法发送数据时,客户端主动直接断开了连接,就会触发该异常;这是正常,忽略这一错误就可以了。 Indy : ...
  • newsxy
  • newsxy
  • 2013年03月11日 15:24
  • 2160

无法登入 FTP 服务器故障对照表

1. connected. waiting for response. 220 serv-u ftp server v4.0 for winsock ready... user anonymous 5...
  • B_zhang
  • B_zhang
  • 2011年05月16日 11:19
  • 14078

TightVNC 2.0.4 Connection Closed问题

症状(SYMPTOM):  服务端tvnserver-2.0.4,客户端tvnviewer-1.5.4,采用vs2010编译,操作系统为WinXP SP2/SP3。客户端在连接并且通过验证后报Con...
  • m_star_jy_sy
  • m_star_jy_sy
  • 2011年08月25日 11:01
  • 4430

linux 和 windows 下的socket之间的差别

1、socket描述符的定义不同 windows: 套接字描述符为一个局柄SOCKET。 Linux: 套接字描述符为一个int型整数,与其他的文件描述符没有差异。2、错误判断的方式不同 w...
  • xiaokaige198747
  • xiaokaige198747
  • 2017年11月24日 00:04
  • 54

TightVNC Connection Closed

使用TightVNC,连接时显示Connection Closed,连接不上。用了半天时间,中文Google,英文Google都试过了,没有找到答案 我换了版本tightvnc-2.0beta2重装,...
  • netes_hai
  • netes_hai
  • 2010年04月14日 16:14
  • 864

XShell连不上本机虚拟机报:Connection closed by foreign host.

ssh联不上本机虚拟及 http://www.cnblogs.com/gylei/archive/2011/12/10/2283484.html
  • jaejoong
  • jaejoong
  • 2014年10月08日 15:39
  • 2507

HttpClient_4 用法 由HttpClient_3 升级到 HttpClient_4 必看

转自:http://www.cnblogs.com/loveyakamoz/archive/2011/07/21/2113252.html HttpClient程序包是一个实现了...
  • Ljj657137723
  • Ljj657137723
  • 2015年04月27日 10:48
  • 193

[delphi]ssl connection closed gracefully

之前写了一个基于ssl的API接口程序,原先用得好好的,也有段时间没有用过了,在解析的时候,出现了一个Connection Closed Gracefully的错误提示,并且程序中断了后面的代码执行,...
  • none01
  • none01
  • 2013年04月02日 09:12
  • 2661
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:TightVNC 2.0.4 Connection Closed问题
举报原因:
原因补充:

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