局域网屏幕监控
下面是程序执行结果
程序中使用从 CSocket 继承来的 CTCPCl ientSocket 和CTCPServerSocket来相互通信。并由客户端使用OnStart( )建立连接通信地址选用回环地址127.0.0.1来进行测试如果要监控特定主机须输入该机ip地址void CScreenDlg::OnStart()
{cl ientsocket.Create();run =false;bool ret=clientsocket.Connect("127.0.0.1",1033); //连接到1033端口if (!ret)return;this->SetTimer(0,1000,NULL); //设置时间间隔是1秒
}
服务器端进行监听
BOOL CServerDlg::OnInitDialog()
{
CDialog::OnInitDialog();
//Add"About..."menu item to system menu.
//IDM_ABOUTBOX must be in thesystemcommand range.
ASSERT((IDM_ABOUTBOX&0xFFF0)==IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX<0xF000);
CMenu*pSysMenu =GetSystemMenu(FALSE);if (pSysMenu !=NULL)
{
CString strAboutMenu;strAboutMenu.LoadString(IDS_ABOUTBOX);if (!strAboutMenu.IsEmpty())
{pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);}
}
//Setthe iconforthis dialog. Theframework doesthis automatical ly
SetIcon(m_hIcon,TRUE); //Set big icon
SetIcon(m_hIcon,FALSE); //Set smal l icon
//TODO:Add extra initialization herebool ret=false;serversoc ket.SetServerEvent(this);ret= serversocket.Create(1033); //打开1033端口ret= serversocket.Listen(); //进行监听return TRUE; //return TRUE unless you setthefocus to a control}
建立连接后服务器端使用GetScreen获取数据
并转换成2进制信息void CServerDlg::GetScreen()
{
CDC dc,bmpdc;int width,height;dc.CreateDC("DISPLAY",NULL,NULL,NULL);
CBitmap bm;width =GetSystemMetrics(SM_CXSCREEN);height=GetSystemMetrics(SM_CYSCREEN);
bm.CreateCompatibleBitmap(&dc,width,height);bmpdc.CreateCompatibleDC(&dc);bmpdc.SelectObject(&bm);bmpdc.BitBlt(0,0,width,height,&dc,0,0,SRCCOPY);bm.GetBitmap(&bitmap);size= bitmap.bmWidthBytes *bitmap.bmHeight;bmpdata= new char[size];
BITMAPIN FOHEADER bih;bih.biBitCount=bitmap.bmBitsPixel;bih.biClrImportant=0;bih.biClrUsed=0;bih.biCompression=0;bih.biHeight=bitmap.bmHeight;bih.biPlanes=1;bih.biSize=sizeof(BITMAPINFOHEADER);bih.biSizeImage=size;bih.biWidth=bitmap.bmWidth;bih.biXPelsPerMeter=0;bih.biYPelsPerMeter=0;
GetDIBits(dc,bm,0,bih.biHeight,bmpdata,(BITMAPINFO*)&bih,DIB_RGB_COLORS);}
发送图片数据:void CServerDlg::SendBitData(CSocket *socket)
{char*data=bmpdata;int sendlen=0;int len =0;do //发送图像数据
{sendlen = socket->Send(data,size);len += sendlen;data+= sendlen;
}while(len<size);delete bmpdata;bmpdata=NULL;size= 0;
}
发送图片结构void CServerDlg::SendBitmap(CSocket *socket)
{
GetScreen();socket->Send(&bitmap,sizeof(BITMAP));
}
客户端使用GetScreen( )来接送二进制数据void CScreenDlg::GetScreen()
{char*buffer= "M"; //获取图像结构信息cl ientsocket.Send(buffer,strlen(buffer));cl ientsocket.Receive(&bitmap,sizeof(BITMAP));size= bitmap.bmWidthBytes *bitmap.bmHeight;bmpdata= new char[size]; //处理图像的劢态数组char*data= bmpdata;int len,receivelen;len = receivelen =0;buffer="D"; //获取图像数据cl ientsocket.Send(buffer,strlen(buffer));do
{receivelen =clientsocket.Receive(data,size);len += receivelen;data+= receivelen;
}while(len<size);
DrawScreen();delete bmpdata;bmpdata=NULL;size= 0;
}
使DrawScreen( )来在窗口中绘制接收到的图形void CScreenDlg::DrawScreen()
{
CDC*dc=m_drawscreen.GetDC();
BITMAPIN FOHEADER bih;bih.biBitCount=bitmap.bmBitsPixel;bih.biClrImportant=0; //绘制图片相应参数bih.biClrUsed=0;bih.biCompression=0;bih.biHeight=bitmap.bmHeight;bih.biPlanes=1;bih.biSize=sizeof(BITMAPINFOHEADER);bih.biSizeImage=size;bih.biWidth=bitmap.bmWidth;bih.biXPelsPerMeter=0;bih.biYPelsPerMeter=0;
CBitmap bm;bm.CreateBitmapIndirect(&bitmap);
CDC bmpdc;bmpdc.CreateCompatibleDC(dc);
SetDIBits(bmpdc.m_hDC,bm,0,bitmap.bmHeight,bmpdata,(BITMAPINFO*)&bih,DIB_RGB_CO LO RS);bmpdc.SelectObject(&bm);
CRect rect;m_drawscreen.GetClientRect(&rect);dc->StretchBlt(0,0,rect.Width(),rect.Height(),&bmpdc,0,0,bitmap.bmWidth,bitmap.bmHeight,SRCCOPY);
}
当关闭窗口时会调用OnStopf来做处理void CScreenDlg::OnStop()
{this->Kil lTimer(0); //结束计时cl ientsocket.ShutDown(2);cl ientsocket.Close(); //关闭套接字
}
另外继承自CSocket的CTCPClentSocket和CTCPServerSocket分别定义了用亍接收的OnAccept( )用亍发送的OnRecieve( )用亍关闭套接字的
OnClose( )
OnAccept:void CTCPServerSocket::OnAccept(int nErrorCode){
CSocket::OnAccept(nErrorCode);cl ientsocket= new CTCPClientSocket(this);this->Accept(*clientsocket);
POSITION pos=ClientList.GetHeadPosition();Cl ientList.InsertBefore(pos,cl ientsocket);if (serverevent !=N ULL)cl ientsocket->SetClientEvent(serverevent);if (serverevent !=N ULL)serverevent->OnAccept(this,nErrorCode);}
OnRecieve:void CTCPClientSocket::OnReceive(int nErrorCode){
CSocket::OnReceive(nErrorCode);if (clientevent !=NULL)cl ientevent->OnReceive(this,nErrorCode);}
美国特价云服务器 2核4G 19.9元杭州王小玉网络科技有限公司成立于2020是拥有IDC ISP资质的正规公司,这次推荐的美国云服务器也是商家主打产品,有点在于稳定 速度 数据安全。企业级数据安全保障,支持异地灾备,数据安全系数达到了100%安全级别,是国内唯一一家美国云服务器拥有这个安全级别的商家。E5 2696v2x2 2核 4G内存 20G系统盘 10G数据盘 20M带宽 100G流量 1...
官方网站:点击访问酷番云官网活动方案:优惠方案一(限时秒杀专场)有需要海外的可以看看,比较划算29月,建议年付划算,月付续费不同价,这个专区。国内节点可以看看,性能高IO为主, 比较少见。平常一般就100IO 左右。优惠方案二(高防专场)高防专区主要以高防为主,节点有宿迁,绍兴,成都,宁波等,节点挺多,都支持防火墙自助控制。续费同价以下专场。 优惠方案三(精选物理机)西南地区节点比较划算,赠送5...
ZJI本月新上线了香港葵湾机房站群服务器,提供4个C段238个IPv4,支持使用8折优惠码,优惠后最低每月1400元起。ZJI是原Wordpress圈知名主机商家:维翔主机,成立于2011年,2018年9月更名为ZJI,提供中国香港、台湾、日本、美国独立服务器(自营/数据中心直营)租用及VDS、虚拟主机空间、域名注册等业务,所选数据中心均为国内普遍访问速度不错的机房。葵湾二型(4C站群)CPU:I...