本例是通过截取桌面图象,压缩并以广播数据报形式发送到各个机子。以便老师的演示可以让每个同学都可以看到。
为将数据以较快的速度从网络上发送出去,须使用Socket的异步通讯方式.异步方式在命令计算机将数据报发送出去后就立即返回,不用等数据发完,当数据发送完后计算机能自动产生一个消息,通知程序可以发送下一个数据报.该方式要求用户必须自己用CAsyncSocket类派生出一个新类,并且要重写OnSend函数,以便响应FD_WRITE网络事件,该事件在数据报已经全部从网络发送出去后产生,并会让计算机自动执行OnSend函数.因此在该函数中要有发送下一个数据报的命令.为了让对方收到数据报后知道这是第几个数据报,可在数据报首用一个数字标记编号,每次发送数据前采用JPEG无损压缩算法压缩数据,以提高传送速度。当一屏信息发送完后,就再截取下一屏信息发送.
发送程序:
发送程序先要在C++下用MFC AppWizard 建立一个基于dialog的目标工作空间,工程名为Netss在第二部必须选取Windows Socket支持.
用MFC AppWizard建立基于dialog的目标工作空间后,在CNetssDlg派生类中加入以下程序,其中OnCreate的函数框架用ClassWizard响应WM_CREATE消息生成,里边做一些初始化操作,目的是当用户刚开始运行程序时能自动设置好环境,提高接收速度。
int i=0,ii,iii,xx,yy,b=1,pa=1000,bl=3840,eee=8192,bb; short aa[350000];LPVOID pbit0=&aa[1000]; CDC wdc;CBitmap bmp1;CDC* pdc;char frame[5000];POINT pp;LPPOINT ppp=&pp; void* pbuf=(void*)(&frame[0]);int *paa=(int*)pbuf;char *pf;short *pfi; class mysocket:public CAsyncSocket //用CAsyncSocket类派生出新类mysocket {public: void OnSend(int nErrorCode) //当上一个数据报已经发送完后自动执行该函数 {if(pa>307200) //如果发送完一屏信息,则截取下一屏信息 {pa=1000; wdc.BitBlt(0,0,640,480,pdc,0,0,SRCCOPY); //把桌面图像复制到wdc的bmp1中 bmp1.GetBitmapBits(614400,pbit0); //获取图像信息 GetCursorPos(ppp); //获取鼠标位置 xx=ppp->x; yy=ppp->y; for(ii=0;ii<10&&xx<640&&yy<480;ii++) //显示鼠标指针 for(iii=0;iii aa[(yy+ii)*640+iii+xx+1000]=31744; } pf=&frame[4]; pfi=(short*)(pf+1); *paa=pa; for(;pf<&frame[3836];) //JPEG压缩一个数据报 {*pf=0x00; for(i=0;i<8;i=i+2) { if(aa[pa]==aa[pa-1]) //JPEG压缩 *pf=*pf|(0x40>>i); else if(aa[pa]==aa[pa-640]) *pf=*pf|(0x80>>i); else if(aa[pa]==aa[pa-641]) *pf=*pf|(0xc0>>i); else {*pfi=aa[pa]; pfi++; } pa++; } pf=(char*)pfi; pfi=(short*)(pf+1); } CAsyncSocket::AsyncSelect(FD_WRITE); //允许对象socks继续响应FD_WRITE事件 CAsyncSocket::SendTo(pbuf,bl,1050,NULL,0); //把该段信息发送出去,发送bl=3840字节 } }; mysocket socks; int CNetssDlg::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CDialog::OnCreate(lpCreateStruct) == -1) return -1; // TODO: Add your specialized creation code here socks.Create(2001,SOCK_DGRAM,FD_WRITE,NULL); //建立数据报Socket,端口号2001 socks.SetSockOpt(SO_BROADCAST,&b,sizeof(BOOL),SOL_SOCKET); //选择广播数据报 socks.SetSockOpt(SO_DONTROUTE,&b,sizeof(BOOL),SOL_SOCKET); socks.SetSockOpt(SO_SNDBUF,&eee,sizeof(int),SOL_SOCKET); //设置发送缓冲区长度eee socks.AsyncSelect(FD_WRITE); //允许对象socks响应FD_WRITE事件 static CWindowDC ddc(GetDesktopWindow()); //引用桌面窗口指针定义对象ddc pdc=&ddc; //将指针pdc指向ddc wdc.CreateCompatibleDC(pdc); //建立与ddc兼容的device context, bmp1.CreateCompatibleBitmap(pdc,640,480); //建立与ddc兼容的位图 wdc.SelectObject(&bmp1); //选择bmp1 return 0; } |
<  
说明:本教程来源互联网或网友上传或出版商,仅为学习研究或媒体推广,wanshiok.com不保证资料的完整性。
1/2 1 2 下一页 尾页 |