.h中的成员变量:
int m_nUdpPortHmv;
SOCKET m_socketHmv;
sockaddr_in m_addrtoHmv;
SOCKADDR_IN m_addrfromHmv;
.cpp中初始化
//初始化广播Socket
m_socketHmv = socket(AF_INET, SOCK_DGRAM, 0);
if (m_socketHmv != INVALID_SOCKET)
{
WSADATA wsdata;
WSAStartup(MAKEWORD(2, 2), &(wsdata));
BOOL opt = TRUE;
setsockopt(m_socketHmv, SOL_SOCKET, SO_BROADCAST, (char* FAR)&opt, sizeof(opt));
//发送addr
memset(&m_addrtoHmv, 0, sizeof(m_addrtoHmv));
m_addrtoHmv.sin_family = AF_INET;
m_addrtoHmv.sin_addr.s_addr = INADDR_BROADCAST;
m_addrtoHmv.sin_port = htons(m_nUdpPortHmv);
//接收addr
memset(&m_addrfromHmv, 0, sizeof(m_addrtoHmv));
m_addrfromHmv.sin_family = AF_INET;
m_addrfromHmv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
m_addrfromHmv.sin_port = htons(m_nUdpPortHmv);
//绑定
if (bind(m_socketHmv, (sockaddr*)&m_addrfromHmv, sizeof(m_addrfromHmv)) != SOCKET_ERROR)
{
//非阻塞
ULONG nval = 1;
ioctlsocket(m_socketHmv, FIONBIO, &nval);
}
}
另起线程接收数据:
void C......::StartHmvThread()
{
if (m_pTreadHmv == NULL)
{
m_bExitThread = false;
AfxBeginThread(recvHmv360Thread, this);
}
}
UINT recvHmv360Thread(LPVOID pVoid)
{
CNetProtocol *pNetProtocol = (CNetProtocol *)pVoid;
int const BUFF_LEN = 1024;
char receiveBuff[BUFF_LEN] = { 0 };
int nDataLen = 0;
SOCKADDR_IN addrCur;
int nSizeAddr = sizeof(addrCur);
while (!pNetProtocol->m_bExitThread)
{
nDataLen = recvfrom(/*g_socketHmvRecv*/pNetProtocol->m_socketHmv, (char *)receiveBuff, BUFF_LEN, 0, (struct sockaddr *)&addrCur, &nSizeAddr);
if (nDataLen != ERROR && nDataLen != -1)
{
//接收的数据
}
Sleep(20);
}
return 0;
}