接收程序:
则要在C++下用MFC AppWizard建立一个单文档目标工作空间,也要使用Windows Socket支持.同样,为以较快的速度从网络上接收数据报,也要用异步方式.处理方法与发送程序相似,但要注意此时要响应的是FD_READ事件,该事件在网络上有数据报到达时发生,因此要重写的是OnReceive函数,该函数中要有从网络接收数据报的命令,并能根据数据报最后的数字编号判断这是第几个数据报,将收到的信息放到合适的地方.
当把保存一屏信息的数据报全部收完后,就可用来把图像再现到屏幕上.处理方法与发送程序类似,不过我们一般希望再现的图像显示在用户窗口中,因此引用用户窗口指针定义CClientDC类对象sdc,代替发送程序中的ddc,再现时的处理与发送时相反,把从网络上收到的数据用bmp2的成员函数SetBitmapBits复制到位图bmp2中,再用sdc的成员函数BitBlt把bmp2中的图像显示在用户窗口中.
接收程序代码: (设目标工作空间名为Netcc)
用MFC AppWizard建立单文档目标工作空间后,在CNetccView派生类中加入以下程序,其中OnCreate函数框架用ClassWizard响应WM_CREATE消息生成,里边做一些初始化操作。
int i=0,a,b=1,bl=3840,eee=8192;short aa[350000],ff;LPVOID pbit0=&aa[1000]; DWORD dw=0;UINT nport=1050;CString name;char frame[5000]; void* pbuf=(void*)(&frame[0]);int *paa=(int*)pbuf;char *pf;short *pfi; CDC wdc;CBitmap bmp2;CDC* pdc; class mysocket:public CAsyncSocket //用CAsyncSocket类派生出新类mysocket {public: void OnReceive(int nErrorCode) //当收到数据报后自动执行该函数 {CAsyncSocket::ReceiveFrom(pbuf,bl,name,nport,0); //从网络接收信息,接收bl=3840字节 pf=&frame[4]; pfi=(short*)(pf+1); for(;pf<&frame[3836];) //JPEG解压缩一个数据报 {for(i=0;i<8;i=i+2) {ff=(*pf)&(0xc0>>i); //JPEG解压缩 if(ff==(0x40>>i)) aa[*paa]=aa[(*paa)-1]; else if(ff==(0x80>>i)) aa[*paa]=aa[(*paa)-640]; else if(ff==(0xc0>>i)) aa[*paa]=aa[(*paa)-641]; else {aa[*paa]=*pfi; pfi++; } (*paa)++; } pf=(char*)pfi; pfi=(short*)(pf+1); } if(*paa>307200) //重现图像 {bmp2.SetBitmapBits(614400,pbit0); //把pbit0指向的内存数据复制到bmp2中 pdc->BitBlt(0,0,640,480,&wdc,0,0,SRCCOPY); //把bmp2中图像复制到用户窗口中 } } }; mysocket sockc; //定义mysocket类对象sockc int CNetccView::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CView::OnCreate(lpCreateStruct) == -1) return -1; // TODO: Add your specialized creation code here sockc.Create(1050,SOCK_DGRAM,FD_READ,NULL); //建立数据报Socket,端口号2001 sockc.SetSockOpt(SO_BROADCAST,&b,sizeof(BOOL),SOL_SOCKET); sockc.SetSockOpt(SO_DONTROUTE,&b,sizeof(BOOL),SOL_SOCKET); sockc.SetSockOpt(SO_RCVBUF,&eee,sizeof(int),SOL_SOCKET); //设置接收缓冲区长度eee sockc.AsyncSelect(FD_READ); //允许对象sockc响应FD_READ事件 static CClientDC ddc(this);pdc=&ddc; //引用用户窗口指针定义对象ddc wdc.CreateCompatibleDC(pdc); //建立与ddc兼容的device context bmp2.CreateCompatibleBitmap(pdc,640,480); //建立与ddc兼容的位图 wdc.SelectObject(&bmp2); *paa=1000; return 0; } |
使用方法,只需老师运行发送程序,学生运行接收程序就可以工作。
说明:本教程来源互联网或网友上传或出版商,仅为学习研究或媒体推广,wanshiok.com不保证资料的完整性。
2/2 首页 上一页 1 2 |