18,356
社区成员
发帖
与我相关
我的任务
分享
void CMysocket::OnReceive(int nErrorCode)
{
// TODO: Add your specialized code here and/or call the base class
static CCsocketDlg *pDlg=(CCsocketDlg*)(AfxGetApp()-> m_pMainWnd);
int len = sizeof(SOCKADDR);
static int m=0;
if (count==0)
{
pDlg->sockServer.Receive(pDlg->recvBuf,pDlg->pack_size);
if(((pDlg->recvBuf)[0]==0x5a)&&((pDlg->recvBuf)[1]==0x4d)&&((pDlg->recvBuf)[3]==0x10))
{
lenth=(pDlg->recvBuf)[7]*256*256*256+(pDlg->recvBuf)[6]*256*256+(pDlg->recvBuf)[5]*256+(pDlg->recvBuf)[4];
packs=(lenth/pDlg->pack_size+(lenth%pDlg->pack_size?1:0));
count=1;
}
}
else
{
if (count!=packs)
{
pDlg->sockServer.Receive(pDlg->recvBuf+count*(pDlg->pack_size),((packs-count)==1)?(lenth-count*(pDlg->pack_size)):pDlg->pack_size);
count++;
}
else
{
CFile file;
CString filename;
filename.Format("%d.jpg",GetTickCount());
if (!file.Open(filename,CFile::modeCreate | CFile::modeReadWrite))
{
pDlg->MessageBox("open file error!");
}
file.Write(pDlg->recvBuf+8,lenth);
file.Close();
count=0;
}
}
}
DWORD WINAPI RecvProc(LPVOID lpParameter)//参数lpParameter为主对话框指针
{
CUdp_transport_svrDlg *pDlg=(CUdp_transport_svrDlg *) lpParameter;
CUdp_transport_svrDlg *pt=(CUdp_transport_svrDlg*)CWnd::FromHandle(((CUdp_transport_svrDlg*)lpParameter)->m_hWnd);//get the handle to post message
int len = sizeof(SOCKADDR);
UINT lenth=0;
ULONG lenthWritten;
int n,m=0;
int pack_size=1024;
IStream *m_pStream;
IPicture *m_pPictrue;
OLE_XSIZE_HIMETRIC m_JPGWidth,m_JPGHeight;
HGLOBAL hMem;
CRect lpRec;
long timeTest1,timeTest2;
LPVOID pData=NULL;
FD_SET fdread;
int ret;
unsigned long arg = 0;
if(SOCKET_ERROR==ioctlsocket(pDlg->sockServer, FIONREAD, &arg))//设置阻塞式
pDlg->MessageBox("ioctlsocket set error.");
//循环接收图片数据并显示
while(1)
{
m=0;
//接收第一包数据并检查是否为头包,若是则取出图片长度,否则跳过,收下一包
m+=recvfrom(pDlg->sockServer,pDlg->recvBuf,pack_size,0,(SOCKADDR *)&(pDlg->addrClient),&len);
if (*(pDlg->recvBuf)!=0x5a||*(pDlg->recvBuf+1)!=0x4d||*(pDlg->recvBuf+3)!=0x10)
{
continue;
}
lenth=pDlg->recvBuf[7]*256*256*256+pDlg->recvBuf[6]*256*256+pDlg->recvBuf[5]*256+pDlg->recvBuf[4];
//循环接收图片
for (n=1;n<(lenth+11)/pack_size;n++)
{
m+=recvfrom(pDlg->sockServer,pDlg->recvBuf+n*pack_size,pack_size,0,(SOCKADDR *)&(pDlg->addrClient),&len);
}
//收尾包
if ((lenth+11)%pack_size)
{
m+=recvfrom(pDlg->sockServer,pDlg->recvBuf+n*pack_size,(lenth+11)%pack_size,0,(SOCKADDR *)&(pDlg->addrClient),&len);
}
//检查图片属否完整,不完整则丢弃
if (m!=lenth+11)
{
continue;
}
//显示图片
hMem=GlobalAlloc(GMEM_MOVEABLE,lenth);
pData=GlobalLock(hMem);
memcpy(pData,pDlg->recvBuf+8,lenth);
GlobalUnlock(hMem);
CreateStreamOnHGlobal(hMem,TRUE,&m_pStream);
OleLoadPicture(m_pStream,len,TRUE,IID_IPicture,(LPVOID*)&m_pPictrue);
m_pPictrue->get_Height(&m_JPGHeight);
m_pPictrue->get_Width(&m_JPGWidth);
pDlg->GetDlgItem(IDC_STATIC_PICTURE)->GetWindowRect(&lpRec);
pDlg->ScreenToClient(&lpRec);
m_pPictrue->Render(pDlg->GetDC()->m_hDC,lpRec.left,lpRec.top,(int)(m_JPGWidth/26.45),(int)(m_JPGHeight/26.45),0,m_JPGHeight,m_JPGWidth,-m_JPGHeight,NULL);
//显示图片结束
}
return 0;
}