有关屏幕监控的问题,小弟毕业设计急用,求达人指教

stone198305 2006-05-15 04:21:06
我在做网络监控的毕业设计,最主要的功能屏幕监控遇到问题了
我服务器代码如下:
//抓取屏幕并发送到客户端
void CMonitorServerView::MonitorPanel(SOCKET socket)
{
char dot=new char[1024*768*4]; //1024*768*4
CBitmap bmp; //内存位图
CDC wdc; //设备环境
CDC *pDC; //指向桌面窗口的设备环境指针

static CWindowDC ddc(GetDesktopWindow()); //引用桌面窗口指针定义对象ddc
pDC=&ddc; //将指针pdc指向ddc
wdc.CreateCompatibleDC(pDC); //建立与ddc兼容的设备环境
bmp.CreateCompatibleBitmap(pDC,1024,768); //建立与ddc兼容的位图
wdc.SelectObject(&bmp); //选择bmp

wdc.BitBlt(0,0,1024,768,pDC,0,0,SRCCOPY); //把桌面图像复制到wdc的bmp中
bmp.GetBitmapBits(1024*768*4,(LPVOID)dot); //将图像信息从内存位图拷贝到缓存
int nSize=1024*768*4;
for (int i=0;i<nSize/US_MAXSIZE;i++) {
send(socket,dot,US_MAXSIZE,0);
dot=dot+US_MAXSIZE;
}
if (nSize%US_MAXSIZE) {
send(socket,dot,nSize%US_MAXSIZE,0);
}
wdc.DeleteDC();
bmp.DeleteObject();
// delete[] dot;
}
这个函数放在OnTimer事件中,定时发送到客户端,这个函数的问题是,我在此定义的char dot=new char[1024*768*4]; //1024*768*3
最后用delete[] dot;释放却老是出现运行错误,为什么无法正确释放啊?我的C++书上就是这么写的,怎么会错呢?
客户端代码如下:
void CMonitorClientView::OnNetEvent(WPARAM wParam, LPARAM lParam)
{
int iEvent=WSAGETSELECTEVENT(lParam);
char buffer[10000];
long iReadLen;

switch(iEvent) {
case FD_READ:
{
iReadLen=recv(ClientSock,buffer,10000,0); //从网络接收数据
buffer[iReadLen]=NULL;
for (int i=0;i<iReadLen;i++) {
dot[pointerss]=buffer[i];
pointerss++;
//判断接收到的信息是否已满一屏
if (pointerss==1024*768*4) {

CDC* pDC=GetWindowDC();//引用用户窗口指针定义对象pDC
CRect rect;
GetClientRect(&rect);
dot[1024*768*4]=NULL;
index++;

if(index==1)
{

wdc.CreateCompatibleDC(pDC); //建立与pDC兼容的device context
bmp.CreateCompatibleBitmap(pDC,1024,768);//建立与pDC兼容的位图
wdc.SelectObject(&bmp);

}

bmp.SetBitmapBits(1024*768*4,(LPVOID)dot); //把内存数据复制到bmp中
//把bmp中图像复制到用户窗口中
pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&wdc,0,0,1024,768,SRCCOPY);
pointerss=0; //接收完一屏后指针复位,准备接收下一屏
UpdateWindow();
}
}
}
break;
default:
return;
}
}
这个函数用于在用户窗口显示屏幕
现在的问题是在客户端显示的杂乱的图象,特别是窗口一移动就出现混乱了,为什么啊?怎么样改进才能正确显示屏幕图象呢?
还有啊,这个程序在本机测试时可以显示图象,虽然很混乱,但是在两台机子上,客户端却什么都没有显示,为什么啊?
小弟毕业设计要交了,这个问题还没解决,急啊,求达人指教啊
...全文
238 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
stone198305 2006-05-16
  • 打赏
  • 举报
回复
aa3000(杀手K):
恩,内存释放的这个问题解决了,多谢了

stone198305 2006-05-16
  • 打赏
  • 举报
回复
多谢aa3000(杀手K):
我的这个函数是放在定时器里的,就是说每隔一段时间执行一次,用你的方法第一次可以执行,到第二次执行的时候就再次出现了运行错误,也还是内存访问的问题,为什么呢
stone198305 2006-05-15
  • 打赏
  • 举报
回复
多谢aa3000(杀手K) 啊
aa3000 2006-05-15
  • 打赏
  • 举报
回复
for (inti=0;i<nSize/US_MAXSIZE;i++) {
send(socket,dot,US_MAXSIZE,0);
dot=dot+US_MAXSIZE; // delete 发生错误所在
}

应当保存一个初始申请到的地址,最后删除它,如
char* dot = new char[1024*768*4];
char* pTemp = dot;
......
delete [] pTemp;
stone198305 2006-05-15
  • 打赏
  • 举报
回复
多谢chenchen()了
stone198305 2006-05-15
  • 打赏
  • 举报
回复
nuaawenlin(飘人) :
我觉得我这个地方没错误吧,因为每次接收iReadLen长度的数据,每次buffer里从buffer[0]到buffer[iReadLen]都是不一样的啊
chenchen 2006-05-15
  • 打赏
  • 举报
回复
代码手上没有合适的,现写的话时间有问题,网上应该可以找到。
大概思路:
1.分辨率动态获得,使用设备无关位图。
2.传输部分,你需要再学习一下,最好能放到工作线程中完成。
3.图像混乱,可能是因为帧没有传输完整。
stone198305 2006-05-15
  • 打赏
  • 举报
回复
这么快就有人回复了啊,多谢chenchen()啊
1.那应该怎么做呢,可以提供思路吗?最好有参考代码,谢谢了
2.我的US_MAXSIZE是1024,难道send(socket,dot,US_MAXSIZE,0)每次发送的不是1024个字节?
3.delete[]dot;我也感觉没什么问题啊,先new申请空间,然后delete释放空间,但是加了这句就会出现运行错误,是内存访问错误,调试说是栈溢出,去掉就没有运行错误了,但是内存空间却是持续增加的,这个肯定不行啊,一会就把机子的内存用完了

还有个问题哈,就是为什么客户端显示的是混乱的图象啊,还有,就是多次的图象重叠在一起,有没有方法在每次重汇图象的时候擦掉上次接收的图象啊?

谢谢了
nuaawenlin 2006-05-15
  • 打赏
  • 举报
回复
2,没有定制数据头和数据尾,那么在进行流传输的时候,很难区别该祯数据与上一祯数据的区别


使用数据头和数据尾,或使用UDP
nuaawenlin 2006-05-15
  • 打赏
  • 举报
回复
1,逻辑上有错误

你每次接收的时候,循环都是从0开始

for (inti=0;i<iReadLen;i++)

但是数据分多批到达,所以你的赋值都是从0开始

dot[pointerss]=buffer[i];

应该改为从上一此接收完的数据总量iReadLen开始,同时point应该加上iReadLen,而不是++
chenchen 2006-05-15
  • 打赏
  • 举报
回复
1.两台机子的分辨率及颜色位数有可能不一样,硬编码不行。
2.网络传输的函数理解有误,send函数返回成功发送的字节数可能小于你试图发送的数量。
3.用delete[]dot;释放却老是出现运行错误,能力有限,没看出来为什么?
chenchen 2006-05-15
  • 打赏
  • 举报
回复
我K,问题太多了。
stone198305 2006-05-15
  • 打赏
  • 举报
回复
自己顶下

18,357

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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