MFC Csocket 局域网获取服务端桌面

相比WIN32 MFC 中都有封装好的类去使用
先说一下socket 连接过程:

这里写图片描述

异步

客户端:

        pclient=new CClientSock;
        pclient->Create();//创建普通的SOCKET
        pklen=sizeof(NETPACKAGE);
        pclient->setdlg(this,1,pklen);
        int rt=pclient->Connect(m_ip,m_port);//连接服务端
        if(rt==1)
        {
            strcpy(usrinfo.name,m_usrname.GetBuffer(0));
            strcpy(usrinfo.password,m_usrpwd.GetBuffer(0));
            usrinfo.uport=3100;
            pclient->SendCommandData(3(char*)&usrinfo,sizeof(USERINFO));

        }
服务端:
  plisten=new CListenSock;
      plisten->Create(m_tport);//创建用于监听的Socket,等待客户端来连接
      //plisten->setdlg(this);
      plisten->Listen(10);//同时可连接10个客户端
    Accept(*pclient,(LPSOCKADDR)&clientaddr,&addrlen);//接收这个客户连接
     recvlen=Receive(pkbuf+bufoffset,pklen,0);
然后根据请求类型判断做什么处理
case 1://用户登录
        memcpy(&usrinfo,pack.buf,sizeof(usrinfo));
        //tstr.Format("User Login:%s,%s,%d",usrinfo.name,usrinfo.password,usrinfo.uport);
        // AfxMessageBox(tstr);
        tstr=usrinfo.password;
        if(tstr=="123")
        {
            strcpy(usrinfo.password,"passwork ok");//密码正确
            //SetTimer(1,1000,NULL);
            islogin=1;
        }
        else
        {
            strcpy(usrinfo.password,"passwork error");密码错误
        }

        pc->SendCommandData(1,(char *)&usrinfo,sizeof(usrinfo));//回复用户密码是否正确
        break;
    case 2://用户退出
        memcpy(&usrinfo,pack.buf,sizeof(usrinfo));
        //  tstr.Format("User Logoff:%s,%s,%d",usrinfo.name,usrinfo.password,usrinfo.uport);
        //AfxMessageBox(tstr);
        //KillTimer(1);
        pc->SendCommandData(2,(char *)&usrinfo,sizeof(usrinfo));//回复退出

        break;
    case 3://屏幕发送命令
        memcpy(&usrinfo,pack.buf,sizeof(usrinfo));
        SendSreenToClient();
        break;
        CapSreen();
      SentSreen(hBitmap,pclient);
void xx::SendSreenToClient()
{
    CapSreen();
      SentSreen(hBitmap,pclient);
}
void xx::CapSreen()
{
    HWND hWnd = ::GetDesktopWindow();//获得屏幕的HWND.
    HDC hScreenDC = ::GetDC(hWnd);   //获得屏幕的HDC.
    HDC MemDC = ::CreateCompatibleDC(hScreenDC);
    RECT rect; 
    ::GetWindowRect(hWnd,&rect);
    SIZE screensize;
    screensize.cx=rect.right-rect.left;
    screensize.cy=rect.bottom-rect.top;
    hBitmap = ::CreateCompatibleBitmap(hScreenDC,screensize.cx,screensize.cy);
    HGDIOBJ hOldBMP = ::SelectObject(MemDC,hBitmap);
    ::BitBlt(MemDC,0,0,screensize.cx,screensize.cy,hScreenDC,rect.left,rect.top,SRCCOPY);
    ::SelectObject(MemDC,hOldBMP);
    ::DeleteObject(MemDC);
    ::ReleaseDC(hWnd,hScreenDC);

}
处理位图与发送

void xx::SentSreen(HBITMAP hBitmap, CClientSock *pc)
{
     HDC hDC =::CreateDC("DISPLAY",NULL,NULL,NULL); 
    int iBits = ::GetDeviceCaps(hDC, BITSPIXEL) * ::GetDeviceCaps(hDC, PLANES);//当前分辨率下每个像素所占字节数  BITSPIXEL:像素相连颜色位数;PLANES:颜色位面数
    int ib = GetDeviceCaps(hDC,BITSPIXEL);
    int bb = ::GetDeviceCaps(hDC, PLANES);
    ::DeleteDC(hDC);

    WORD   wBitCount;   //位图中每个像素所占字节数    
    if (iBits <= 1)
        wBitCount = 1;
    else if (iBits <= 4)
        wBitCount = 4;
    else if (iBits <= 8)
        wBitCount = 8;
    else if (iBits <= 24)
        wBitCount = 24;
    else
        wBitCount = iBits;

    DWORD   dwPaletteSize=0;    //调色板大小, 位图中像素字节大小 
    if (wBitCount <= 8)     
        dwPaletteSize = (1 << wBitCount) *  sizeof(RGBQUAD);    



    BITMAP  bm;        //位图属性结构
    ::GetObject(hBitmap, sizeof(bm), (LPSTR)&bm);  


    BITMAPINFOHEADER   bi,bi1;       //位图信息头结构     
    bi.biSize            = sizeof(BITMAPINFOHEADER);  
    bi.biWidth           = bm.bmWidth;
    bi.biHeight          = bm.bmHeight;
    bi.biPlanes          = 1;
    bi.biBitCount        = wBitCount;
    bi.biCompression     = BI_RGB; //BI_RGB表示位图没有压缩
    bi.biSizeImage       = 0;
    bi.biXPelsPerMeter   = 0;
    bi.biYPelsPerMeter   = 0;
    bi.biClrUsed         = 0;
    bi.biClrImportant    = 0;
    bi1=bi;
    bi1.biBitCount=24;

    DWORD dwBmBitsSize = ((bm.bmWidth * wBitCount+31)/32) * 4 * bm.bmHeight;    
    HANDLE hDib  = ::GlobalAlloc(GHND,dwBmBitsSize + dwPaletteSize + sizeof(BITMAPINFOHEADER));  //为位图内容分配内存
    LPBITMAPINFOHEADER lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);//返回值是第一块内存的指针
    *lpbi = bi;

    HANDLE hPal = ::GetStockObject(DEFAULT_PALETTE);  // 处理调色板 
    HANDLE  hOldPal=NULL; 
    if (hPal)
    {
        hDC = ::GetDC(NULL);
        hOldPal = SelectPalette(hDC,(HPALETTE)hPal, FALSE);
        RealizePalette(hDC);
    }
    int nOutputBytes = 0;
    unsigned char *m_pDibBits;
    m_pDibBits = new unsigned char [dwBmBitsSize];
    //::GetDIBits(hDC, hBitmap, 0, (UINT) bm.bmHeight,m_pDibBits,(BITMAPINFO*)lpbi,DIB_RGB_COLORS);
    ::GetDIBits(hDC, hBitmap, 0, (UINT) bm.bmHeight,(LPSTR)lpbi + sizeof(BITMAPINFOHEADER)+dwPaletteSize,(BITMAPINFO*)lpbi,DIB_RGB_COLORS);// 获取该调色板下新的像素值
    if (hOldPal)//恢复调色板
    {
        SelectPalette(hDC, (HPALETTE)hOldPal, TRUE);
        RealizePalette(hDC);
        ::ReleaseDC(NULL, hDC);
    }
    int i=0,j=0;
     unsigned char* pcolor;
     pcolor=(unsigned char*)lpbi+sizeof(BITMAPINFOHEADER)+dwPaletteSize;

    //得到像素值
    for(j=0;j<dwBmBitsSize;j++)
    {
        if(j%4==3)
        {
            j++;
        }
        m_pDibBits[i]=pcolor[j];        
        i++;
    }




 //////////////////////// //发送图像头信息 /////////////////////////////
        CapSreenHeader cheader;
        cheader.factlen=i; //图像长度
        NETPACKAGE pack;
       long filestep=0;
       long fileend=0;
       long lFileSize=i;//图像长度

        int end = 0;     
        int len=0;
        int dtlen=50000;//数据块长度

        int plen=sizeof(NETPACKAGE);//数据包长度50008

        filestep=lFileSize/dtlen;//数据块数
        fileend=lFileSize%dtlen;//最后一块数据长度

        cheader.filelength=lFileSize;////图像文件长度
        cheader.blocklen=dtlen;//数据块长度
        cheader.width=bm.bmWidth;//图像宽度
        cheader.height=bm.bmHeight;//图像高度

         pack.type=3; //图像头命令
         pack.len=sizeof(cheader);//图像头信息长度
         memset(pack.buf,7,dtlen);
         memcpy(pack.buf,(char*)&cheader,pack.len);
         pc->Send((unsigned char*)&pack,plen,0);//发送图像头信息
         Sleep(100);

        ////////////////////发送图像内容///////////////// 

         pack.type=4; //图像内容命令
         pack.len=dtlen;//图像块长度

        for(j=0;j<filestep;j++)
        {
            memcpy(pack.buf,&m_pDibBits[j*dtlen],dtlen);
            pc->Send((unsigned char*)&pack,plen,0);//发送图像信息 
        }   
         pack.type=5; ////最后一块数据命令
         pack.len=fileend;//最后一块数据长度
         memset(pack.buf,7,dtlen);
         memcpy(pack.buf,&m_pDibBits[filestep*dtlen],fileend);//发送最后一块数据
         pc->Send((unsigned char*)&pack,plen,0);//发送图像头信息

    GlobalUnlock(hDib);   //清除   
    GlobalFree(hDib);
    delete []m_pDibBits;


}

具体如何实现 看代码请到这里下载
https://download.csdn.net/download/qq_36088602/10276368

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值