#ifndef MulticastSocket_H
#define MulticastSocket_H
//
#include <WinSock.h>
//
class CMulticastSocket
{
public:
CMulticastSocket();
~CMulticastSocket();
public:
bool JoinGroup(const char *pszGroupIP, unsigned int nGroupPort, unsigned int nTTL, bool bLoopback);
bool LeaveGroup();
bool SendTo(const char *pszBuffer, int nSize);
void SetLoopBack(bool bLoop);
bool SetTTL(unsigned int nTTL);
private:
bool CreateSendingSocket(unsigned int nTTL, bool bLoopBack);
private:
SOCKET m_hSendSocket;
SOCKADDR_IN m_addrHostGroup;
};
//
#endif
----------------------------------------------------------------------------------------------------------
#include "MulticastSocket.h"
//
#pragma comment(lib, "ws2_32.lib")
//
CMulticastSocket::CMulticastSocket()
: m_hSendSocket(INVALID_SOCKET)
{
}
CMulticastSocket::~CMulticastSocket()
{
closesocket(m_hSendSocket);
m_hSendSocket = INVALID_SOCKET;
}
//
bool CMulticastSocket::CreateSendingSocket(unsigned int nTTL, bool bLoopBack)
{
if (m_hSendSocket != INVALID_SOCKET) {
return false;
}
m_hSendSocket = socket(AF_INET, SOCK_DGRAM, 0);
if (m_hSendSocket == INVALID_SOCKET) {
return false;
}
if (!SetTTL(nTTL)) {
return false;
}
SetLoopBack(bLoopBack);
return true;
}
bool CMulticastSocket::SetTTL(unsigned int nTTL)
{
if (m_hSendSocket == INVALID_SOCKET) {
return false;
}
return (setsockopt(m_hSendSocket, IPPROTO_IP, IP_MULTICAST_TTL, (const char *) &nTTL, sizeof(nTTL)) == 0);
}
void CMulticastSocket::SetLoopBack(bool bLoop)
{
if (m_hSendSocket == INVALID_SOCKET) {
return;
}
int nLoopBack = (int) bLoop;
setsockopt(m_hSendSocket, IPPROTO_IP, IP_MULTICAST_LOOP, (const char *) &nLoopBack, sizeof(nLoopBack));
}
bool CMulticastSocket::LeaveGroup()
{
if (m_hSendSocket == INVALID_SOCKET) {
return false;
}
ip_mreq mrMReq;
if (setsockopt(m_hSendSocket, IPPROTO_IP, IP_DROP_MEMBERSHIP, (char FAR *) &mrMReq, sizeof(mrMReq)) == 0) {
return false;
}
closesocket(m_hSendSocket);
m_hSendSocket = INVALID_SOCKET;
return true;
}
bool CMulticastSocket::SendTo(const char *pszBuffer, int nSize)
{
if (m_hSendSocket == INVALID_SOCKET) {
return false;
}
return (sendto(m_hSendSocket, pszBuffer, nSize, 0, (SOCKADDR *) &m_addrHostGroup, sizeof(SOCKADDR)) != SOCKET_ERROR);
}
bool CMulticastSocket::JoinGroup(const char *pszGroupIP, unsigned int nGroupPort, unsigned int nTTL, bool bLoopback)
{
if (m_hSendSocket != INVALID_SOCKET) {
return false;
}
memset(&m_addrHostGroup, 0, sizeof(m_addrHostGroup));
m_addrHostGroup.sin_port = htons((unsigned short) nGroupPort);
m_addrHostGroup.sin_family = AF_INET;
m_addrHostGroup.sin_addr.s_addr = inet_addr(pszGroupIP);
return CreateSendingSocket(nTTL, bLoopback);
}
----------------------------------------------------------------------------------------------------------
#include "MulticastSocket.h"
//
int main()
{
WSAData wsaData;
WSAStartup(MAKEWORD(2, 2), &wsaData);
char szText[] = "Text";
CMulticastSocket multicast;
if (!multicast.JoinGroup("234.5.6.7", 20000, 5, false)) {
return 0;
}
while (1) {
multicast.SendTo(szText, sizeof(szText));
Sleep(4000);
}
return 0;
}