vc网络远程控制软件,图像传到一定数量就停止不传了?

whango 2012-08-13 09:30:50
这个远程控制是这样的:
服务器端:用timer定时不间断的发送屏幕截图给客户端,同时接收客户端发来的鼠标键盘消息。

客户端:接收图片并显示,发送鼠标键盘消息给服务器端。


问题是:在运行一段时间后(这段时间基本上固定,变化不大),图片就不发送了,客户端不再触发OnReceive事件。但是连接没有断,客户端依然可以给服务器端发送鼠标键盘消息。而且就算我手动断掉连接重新连图片也不发送,但是连接可以建立,鼠标键盘事件可以发送。。。必须要重新启动服务器端才可以继续发送图片。
如果是发送区缓存问题的话断掉连接重新连后不就应该好了么?我觉得应该是服务器的问题。
这是什么情况?大大们求解。。!!!!!


服务器端一部分代码:

void CMyServerDlg::OnClose()
{

m_ListWords.AddString("断开连接");

m_ServerSocket->Close();
m_ListenSocket->Close();
if(m_ServerSocket != NULL)
{
delete m_ListenSocket;
delete m_ServerSocket;
m_ServerSocket =NULL;
}
KillTimer(1);

void CMyServerDlg::OnAccept()
{
m_ServerSocket=new MySocket;
m_ServerSocket->GetDlg(this);
m_ListenSocket->Accept(*m_ServerSocket);
m_ServerSocket->AsyncSelect(FD_READ|FD_CLOSE);

SetTimer(1,800,NULL);


}


void CMyServerDlg::SentScreen() //发送图片的部分代码,buffer是图片缓存,size是图片大小。大概40+k大吧。
{
mesize=size;
m_ServerSocket->Send(&mesize,sizeof(int));
m_ServerSocket->Send(buffer,size,0);
free(buffer);
buffer=NULL;

}
...全文
87 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
whango 2012-08-13
  • 打赏
  • 举报
回复
问题已找出。ScrBmp没有释放资源。。。。但是原理不是很懂。。知道的大大们说下呗。。
晚点结贴。
whango 2012-08-13
  • 打赏
  • 举报
回复
继续调试后发现从ScrBmp.Detach();
这句开始出错。DC的建立正确了。但是位图就一直不变了。。位图对象ScrBmp一直处于无效。。是为什么呢?
whango 2012-08-13
  • 打赏
  • 举报
回复
我用的CxImage类做的jpg图。。。最新发现,timer还在继续运行,但是放图片CxImage::DeCode貌似出问题了。。。不发送图片是因为size等于0,不变了。。是为什么?

附上截图的代码。

void CMyServerDlg::GetScreen()
{
CDC ScrDc,MemDc;
ScrWidth = GetSystemMetrics(SM_CXSCREEN);
ScrHeight = GetSystemMetrics(SM_CYSCREEN);
ScrDc.CreateDCA("Display",NULL,NULL,NULL);
MemDc.CreateCompatibleDC(&ScrDc);
ScrBmp.Detach();
ScrBmp.CreateCompatibleBitmap(&ScrDc,ScrWidth,ScrHeight);
CBitmap * YetBmp = MemDc.SelectObject(&ScrBmp);
MemDc.BitBlt(0,0,ScrWidth,ScrHeight,&ScrDc,0,0,SRCCOPY);
MemDc.SelectObject(YetBmp);
CClientDC dc(this);



CxImage Image;
Image.CreateFromHBITMAP((HBITMAP)ScrBmp.GetSafeHandle());
size=0;
buffer=NULL;
Image.SetJpegQuality(12);
Image.Encode(buffer,size,CXIMAGE_FORMAT_JPG); //之前一直运行得好好的。但是一段时间后size就一直是0了。。。
ScrDc.DeleteDC();
MemDc.DeleteDC();
Image.Destroy();





}
淡定的飘着 2012-08-13
  • 打赏
  • 举报
回复
期待大牛,帮顶
whango 2012-08-13
  • 打赏
  • 举报
回复
自己顶
Yofoo 2012-08-13
  • 打赏
  • 举报
回复
系统的gdi资源是有限制的, 泄漏导致后面的gdi操作会失败, 图片都是空数据
Panke 2012-08-13
  • 打赏
  • 举报
回复

void CMyServerDlg::SentScreen() //发送图片的部分代码,buffer是图片缓存,size是图片大小。大概40+k大吧。
{
mesize=size;
m_ServerSocket->Send(&mesize,sizeof(int));
while(size>0)
size -= m_ServerSocket->Send(buffer,size,0);
free(buffer);
buffer=NULL;

}

尝试下

18,356

社区成员

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

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