UDP 多播

51 篇文章 0 订阅


#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;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值