VNC 中rfb协议是如何传输数据的

swj2009 2011-08-24 04:14:16
如题
看了好多天也没搞明白rfb是如何传输数据的,客户端和服务器之间如何传输数据
传输数据是哪一部分啊
...全文
914 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
swj2009 2011-09-02
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 dahuaixiaohuai 的回复:]
这是我写的一个例子不是VNC里的代码
[/Quote]

虽然没解决问题,但还是谢谢!
swj2009 2011-08-25
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 dahuaixiaohuai 的回复:]
你要是知道传输部分的东西呢,还是业务逻辑部分的东西,如果是前者,主要是socket通信方面的东西,后者就需要理解各种业务,在前者的基础上实现。
[/Quote]

服务器端如何把屏幕传输到客户端然后显示出来
一叶之舟 2011-08-25
  • 打赏
  • 举报
回复
这是我写的一个例子不是VNC里的代码
swj2009 2011-08-25
  • 打赏
  • 举报
回复
VNC里没有这个函数吧
我用的vnc源代码版本是vnc-4_1_3,没有这个函数
而且在设断点运行的时候,感觉不是一直在GetDC(),GetDC()在初始的时候获取过一次,以后就不是GetDC()了,但是也没找到其他的获取屏幕的方法
一叶之舟 2011-08-25
  • 打赏
  • 举报
回复

void CaptureDeskToFile(char *szDeskFile)
{
// 设置windows station 和 desktop
HDESK hdesk;
HWINSTA hwinsta;

HDESK hdeskCurrent;
HWINSTA hwinstaCurrent;

hwinstaCurrent = GetProcessWindowStation();
if (hwinstaCurrent == NULL)
{
TRACE("get window station err");
return;
}

hdeskCurrent = GetThreadDesktop(GetCurrentThreadId());
if (hdeskCurrent == NULL)
{
TRACE(_T("get window desktop err"));
return;
}

//打开winsta0
hwinsta = OpenWindowStation("winsta0", FALSE,
WINSTA_ACCESSCLIPBOARD |
WINSTA_ACCESSGLOBALATOMS |
WINSTA_CREATEDESKTOP |
WINSTA_ENUMDESKTOPS |
WINSTA_ENUMERATE |
WINSTA_EXITWINDOWS |
WINSTA_READATTRIBUTES |
WINSTA_READSCREEN |
WINSTA_WRITEATTRIBUTES);

if (hwinsta == NULL)
{
TRACE(_T("open window station err"));
return;
}

if (!SetProcessWindowStation(hwinsta))
{
TRACE(_T("Set window station err"));
return;
}

//打开desktop
hdesk = OpenDesktop("default", 0, FALSE,
DESKTOP_CREATEMENU |
DESKTOP_CREATEWINDOW |
DESKTOP_ENUMERATE |
DESKTOP_HOOKCONTROL |
DESKTOP_JOURNALPLAYBACK |
DESKTOP_JOURNALRECORD |
DESKTOP_READOBJECTS |
DESKTOP_SWITCHDESKTOP |
DESKTOP_WRITEOBJECTS);
if (hdesk == NULL)
{
TRACE(_T("Open desktop err"));
return;
}

SetThreadDesktop(hdesk);

HWND hWnd = NULL;
HDC hScreenDC = NULL;
HDC MemDC = NULL;

hWnd = ::GetDesktopWindow(); // 获得屏幕的HWND.
hScreenDC = ::GetDC(hWnd); // 获得屏幕的HDC.
MemDC = ::CreateCompatibleDC(hScreenDC);

if (hWnd == NULL)
{
TRACE("hWnd:error=%d",GetLastError());
}

if (hScreenDC == NULL)
{
TRACE("hScreenDC:error=%d",GetLastError());
}

if (MemDC == NULL)
{
TRACE("MemDC:error=%d",GetLastError());
}

RECT rect;
if (::GetWindowRect(hWnd,&rect) == FALSE)
{
TRACE("GetWindowRect:error=%d",GetLastError());
}

SIZE screensize;
screensize.cx=rect.right-rect.left;
screensize.cy=rect.bottom-rect.top;
HBITMAP hBitmap = ::CreateCompatibleBitmap(hScreenDC,screensize.cx,screensize.cy);
HGDIOBJ hOldBMP = ::SelectObject(MemDC,hBitmap);

if (hBitmap == NULL)
{
TRACE("hBitmap:error=%d",GetLastError());
}

if (hOldBMP == NULL)
{
TRACE("hOldBMP:error=%d",GetLastError());
}

SetLastError(0);

if (::BitBlt(MemDC,0,0,screensize.cx,screensize.cy,hScreenDC,rect.left,rect.top,SRCCOPY) == 0)
{
TRACE("BitBlt:error=%d",GetLastError());
}

::SelectObject(MemDC,hOldBMP);
::DeleteObject(MemDC);
::ReleaseDC(hWnd,hScreenDC);

//将bmp保存到文件
//WriteBmpToFile(hBitmap,szPathOfDesktop);

if (!SetProcessWindowStation(hwinstaCurrent))
return;

if (!SetThreadDesktop(hdeskCurrent))
return;

if (!CloseWindowStation(hwinsta))
return ;

if (!CloseDesktop(hdesk))
return ;

}
swj2009 2011-08-25
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 dahuaixiaohuai 的回复:]
服务器端获取屏幕图像(频率根据性能要求),一般要进行压缩(如H264)后发送到客户端,客户端解压后绘制到显示区域。
[/Quote]

服务器端是如何获取屏幕的
一叶之舟 2011-08-25
  • 打赏
  • 举报
回复
服务器端获取屏幕图像(频率根据性能要求),一般要进行压缩(如H264)后发送到客户端,客户端解压后绘制到显示区域。
一叶之舟 2011-08-24
  • 打赏
  • 举报
回复
你要是知道传输部分的东西呢,还是业务逻辑部分的东西,如果是前者,主要是socket通信方面的东西,后者就需要理解各种业务,在前者的基础上实现。
一叶之舟 2011-08-24
  • 打赏
  • 举报
回复
知道VNC,由客户端发送请求数据包给服务器,服务器处理完给客户端回应数据包,典型的C/S模式。
但是其中有一部分是通过长连接实现的,就是服务器向客户端传输图像信息,是由客户端向服务器建立连接,建立后服务器间隔(定时)向客户端发送屏幕图像数据包(经过压缩处理的),客户端接收到后解码显示,其它的操作命令都是由客户端主动发起。
swj2009 2011-08-24
  • 打赏
  • 举报
回复
VNC 一个远程控制工具软件,代码是开源的,其核心的部分是rfb协议,
看了几天源代码,一直没弄明白rfb协议在客户端和服务器之间是怎么传输数据的
一叶之舟 2011-08-24
  • 打赏
  • 举报
回复
不管哪个协议,传输的数据都是根据协议规格组织的一块二进制数据而已,不知你所问的rfb是如何传输数据是指什么意思。
至善者善之敌 2011-08-24
  • 打赏
  • 举报
回复
帮你顶~
swj2009 2011-08-24
  • 打赏
  • 举报
回复
没有人回答吗?
自己顶一下

64,649

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧