18,357
社区成员
发帖
与我相关
我的任务
分享
BOOL XXXX::Open(PIP_ADAPTER_INFO pAdapter)
{
int iRet;
m_nSocket = socket(AF_INET, SOCK_DGRAM, 0);
if (m_nSocket == INVALID_SOCKET)
{
return FALSE;
}
const int routenum = 255;//10;
iRet = setsockopt(m_nSocket, IPPROTO_IP, IP_MULTICAST_TTL, (char*)&routenum, sizeof(routenum));
if (iRet == SOCKET_ERROR)
{
closesocket(m_nSocket);
return FALSE;
}
const int loopback = 1; //1/0:允许/不允许回馈
iRet = setsockopt(m_nSocket, IPPROTO_IP, IP_MULTICAST_LOOP, (char*)&loopback, sizeof(loopback));
if (iRet == SOCKET_ERROR)
{
closesocket(m_nSocket);
return FALSE;
}
SOCKADDR_IN saUdpCli;
memset((char *)&saUdpCli, 0, sizeof(saUdpCli));
m_bFind = FindIp(pAdapter, m_strIp);
saUdpCli.sin_family = AF_INET;
if (m_bFind)
{
saUdpCli.sin_addr.s_addr = inet_addr(m_strIp);
}
else
{
saUdpCli.sin_addr.s_addr = htonl(INADDR_ANY);
}
saUdpCli.sin_port = htons(BROADCAST_RECV_PORT);
iRet = bind(m_nSocket, (SOCKADDR *)&saUdpCli, sizeof(SOCKADDR_IN));
if (SOCKET_ERROR == iRet)
{
::MessageBox(NULL, "bind failure", "SearchDVS", MB_OK);
closesocket(m_nSocket);
return FALSE;
}
ip_mreq mreq;
memset(&mreq, 0, sizeof(mreq));
if (m_bFind)
{
mreq.imr_interface.S_un.S_addr = inet_addr(m_strIp);//htonl(INADDR_ANY);
}
else
{
mreq.imr_interface.S_un.S_addr = htonl(INADDR_ANY);
}
mreq.imr_multiaddr.S_un.S_addr = inet_addr("224.0.1.10");
//加入一个多播组
iRet = setsockopt(m_nSocket, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char*)&mreq, sizeof(mreq));
if (iRet == SOCKET_ERROR)
{
::MessageBox(NULL, "add multicast(224.0.1.10) failure", "SearchDVS", MB_OK);
closesocket(m_nSocket);
return FALSE;
}
return TRUE;
}
BOOL XXXX::Send()
{
CPacket packet;
const char *pszBuffer;
int iBufferSize;
SOCKADDR_IN servAddr;
pszBuffer = packet.Packet(PARAM_REQUEST, 0, NULL, 0, iBufferSize);
memset(&servAddr, 0, sizeof(SOCKADDR_IN));
servAddr.sin_family = AF_INET;
servAddr.sin_addr.s_addr = inet_addr("224.0.1.10");
servAddr.sin_port = htons(BROADCAST_SEND_PORT);
if (m_bFind)
{
unsigned long addr = inet_addr(m_strIp);
setsockopt(m_nSocket, IPPROTO_IP, IP_MULTICAST_IF, (char *)&addr, sizeof(addr));
}
int iLen = sendto(m_nSocket, pszBuffer, iBufferSize, 0, (sockaddr *)&servAddr, sizeof(SOCKADDR_IN));
return TRUE;
}