18,363
社区成员




UINT recv_netset_thread(LPVOID lParam)
{
CNetSet *pNetset = (CNetSet *)lParam ;
CString m_transmac ;
char header[32] ;
unsigned char pMac[100] ;
BOOL b ;
char buf[1500] ;
int m_control ;
m_transmac = CPublic::markmac ;
UINT uni = PROTOCOLHEAD_VER;
memcpy(header,&uni,4);
sscanf(m_transmac.GetBuffer(),"%2x%2x%2x%2x%2x%2x",pMac,pMac+1,pMac+2,pMac+3,pMac+4,pMac+5);
memcpy(header+4,pMac,6);//目的mac地址
memcpy(header+10,CPublic::g_ucLocalMac,6);//原mac地址
memcpy(header+16,"temp",4);//会话标示
uni = 0x80000000 ;
memcpy(header+20, &uni ,4);//数据包编号
uni = CMD_UDP_REQUEST_CHECK_RADIONETWORK_ALL ;
memcpy(header+24,&uni,4);//cmd
uni = 0 ;//长度为0
memcpy(header+28,&uni,4);//数据包长度
CAsyncSocket CbroadcastSocket;
if(CbroadcastSocket.Create(0,SOCK_DGRAM) == SOCKET_ERROR)
{
TRACE("fail to create socket\n");
return -1;
}
b = TRUE;
if(!CbroadcastSocket.SetSockOpt(SO_BROADCAST,&b,sizeof(b),SOL_SOCKET))
{
TRACE("fail to SetSockOpt\n");
CbroadcastSocket.Close();
return -1;
}
int nOpt = 1000;
if(!CbroadcastSocket.SetSockOpt(SO_RCVTIMEO,(char *)&nOpt,sizeof(int),SOL_SOCKET))
{
TRACE("fail to SetSockOpt\n");
CbroadcastSocket.Close();
return -1;
}
b = true;
if(!CbroadcastSocket.SetSockOpt(SO_REUSEADDR,(char *)&b,sizeof(BOOL),SOL_SOCKET))
{
TRACE("fail to SetSockOpt\n");
CbroadcastSocket.Close();
return -1;
}
//通过UDP发送
int done = CbroadcastSocket.SendTo((string(header,32)).c_str(),32,PORT_UDP_PU,NULL,0);
TRACE("done = %d to config pu net through UDP\n",done);
if(done < 0)
{
AfxMessageBox("fail to send broadcast to config pu net\n");
CbroadcastSocket.Close();
return -1;
}
DWORD dwTick1 = ::GetTickCount() ;
while ( WaitForSingleObject(CPublic::m_event,100) != WAIT_OBJECT_0)
{
DWORD dwNow1 = ::GetTickCount() ;
if (dwNow1 - dwTick1 > 15000)//大于15秒表示接收超时
break ;
Sleep(100) ;
done = CbroadcastSocket.ReceiveFrom(buf,1500,NULL,0);//将数据接收在buf中
if (done < 0)
continue ;
m_control = *(int *)(buf + 24) ;
if (CMD_UDP_ANSWER_CHECK_RADIONETWORK_ALL == m_control)
{
//xp这里面的数据会接收到多次
}
。。。
}