18,356
社区成员
发帖
与我相关
我的任务
分享
WSADATA data;
WSAStartup(2,&data);
GdiplusStartup(&m_pGdiToken,&m_gdiplusStartupInput,NULL);
struct ip_mreq ipmr;
int len=sizeof(ipmr);
//获取本机IP
//hostent* phost = gethostbyname("");
//char* localIP = inet_ntoa (*(struct in_addr *)*phost->h_addr_list);
sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);//广播的话是,127.0.0.1
addr.sin_port = htons(5002);
ipmr.imr_multiaddr.s_addr=inet_addr("234.5.5.5");
ipmr.imr_interface.s_addr=htonl(INADDR_ANY);
//设置广播类型setsockopt(m_Socket,SOL_SOCKET,SO_BROADCAST,(char*)&optval,sizeof(optval));
//创建套接字
m_Socket = socket(AF_INET,SOCK_DGRAM,0);
if (m_Socket == INVALID_SOCKET)
{
MessageBox("套接字创建失败!");
}
//绑定套接字
if (bind(m_Socket,(sockaddr*)&addr,sizeof(addr))==SOCKET_ERROR)
{
MessageBox("套接字绑定失败!");
}
setsockopt(m_Socket,IPPROTO_IP,IP_ADD_MEMBERSHIP,(char*)&ipmr,len);
WSAAsyncSelect(m_Socket,m_hWnd,CM_RECEIVED,FD_READ);
------------------------------
然后在响应OnRead事件中如下:
BYTE *buffer= new BYTE[MAX_BUFF];
int factsize =sizeof(sockaddr);
int ret = recvfrom(m_Socket,(char*)buffer,MAX_BUFF,0,(sockaddr*)&m_Addr,&factsize);
if(ret==-1)
{
delete buffer;
buffer=NULL;
m_iRecvCount=1;
bRecing=FALSE;
return;
}
UDPPACKAGE *pack;
pack=(UDPPACKAGE*)buffer;
int iCount=pack->iIndex;
int iJpegSize=pack->JpegSize;
int iBufferSize=pack->buffersize;
bool bFinish=pack->bFinish;
if(m_iRecvCount==iCount)//进行处理
{
memcpy(m_tmp+PICPACKSIZE*(m_iRecvCount-1),pack->buffer,iBufferSize);
m_iRecvCount+=1;
if(bFinish)
{
m_iRecvCount=1;
ShowScreen(iJpegSize,m_tmp);
}
}
else
m_iRecvCount=1;
delete buffer;
closesocket(m_Socket);
WSACleanup();
GdiplusShutdown(m_pGdiToken);