UDP组播配置

本文详细介绍如何在Windows系统上配置组播协议,包括注册列表的设置、IGMPLevel和IGMPVersion变量的创建,以及使用C++进行组播功能的发送与接收测试。此外,还提供了Qt和SocketTool工具的组播测试方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.配置组播协议

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
点击添加,安装列表的协议,随后可以看到如下所示
在这里插入图片描述

2.配置注册列表

  1. 按下win+R打开,输入regedit;
  2. 依次展开HKEY_LOCAL_MACHINE——SYSTEM——CurrentControlSet——Service——Tcpip;
  3. 选择Parameters;
  4. 找到IGMPLevel和IGMPVersion两个变量;如果没有,则新建这两个变量,类型为字符串值,值分别为2和3;
  5. 重启电脑。

3.测试组播功能

发送代码:

#include "pch.h"
#include <stdio.h>  
#include <winsock2.h>  
#include <ws2tcpip.h>  
#pragma comment(lib, "ws2_32.lib")

int main()
{
	int iRet = 0;
	WSADATA wsaData;
	WSAStartup(MAKEWORD(2, 2), &wsaData);

	SOCKET sock = socket(AF_INET, SOCK_DGRAM, 0);

	int iFlag = 1;	// 0-同一台主机 1-夸主机
	iRet = setsockopt(sock, IPPROTO_IP, IP_MULTICAST_TTL, (char*)&iFlag, sizeof(iFlag));
	if (iRet != 0) {
		printf("setsockopt fail:%d", WSAGetLastError());
		return -1;
	}

	sockaddr_in addr;
	addr.sin_addr.S_un.S_addr = inet_addr("224.16.132.22");//修改组播IP
	addr.sin_family = AF_INET;
	addr.sin_port = htons(8119);//修改组播端口

	char strSend[1024] = { 0 };
	static int iIdx = 0;
	while (1)
	{
		sprintf_s(strSend, "udp send group data:%d", iIdx++);
		iRet = sendto(sock, strSend, strlen(strSend) + 1, 0, (sockaddr*)&addr, sizeof(sockaddr));
		if (iRet <= 0) {
			printf("send fail:%d", WSAGetLastError());
		}
		else {
			printf("send data:%s\n", strSend);
		}
		Sleep(500);
	}

	closesocket(sock);
	WSACleanup();

	return 0;
}

接收代码:

#include "pch.h"
#include <stdio.h>  
#include <winsock2.h>  
#include <ws2tcpip.h>  
#pragma comment(lib, "ws2_32.lib")

int main()
{
	int iRet = 0;
	WSADATA wsaData;
	WSAStartup(MAKEWORD(2, 2), &wsaData);

	SOCKET sock = socket(AF_INET, SOCK_DGRAM, 0);

	sockaddr_in addr;
	addr.sin_family = AF_INET;
	//addr.sin_addr.S_un.S_addr = INADDR_ANY;
	addr.sin_addr.S_un.S_addr = inet_addr("192.168.4.184");//修改本地IP
	addr.sin_port = htons(8119);//修改组播端口

	bool bOptval = true;
	iRet = setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char*)&bOptval, sizeof(bOptval));
	if (iRet != 0) {
		printf("setsockopt fail:%d", WSAGetLastError());
		return -1;
	}

	iRet = bind(sock, (sockaddr*)&addr, sizeof(addr));
	if (iRet != 0) {
		printf("bind fail:%d", WSAGetLastError());
		return -1;
	}
	printf("socket:%d bind success\n", sock);

	// 加入组播  
	ip_mreq multiCast;
	//multiCast.imr_interface.S_un.S_addr = INADDR_ANY;
	multiCast.imr_interface.S_un.S_addr = inet_addr("192.168.4.184");//修改本机IP
	multiCast.imr_multiaddr.S_un.S_addr = inet_addr("224.16.132.22");//修改组播IP
	iRet = setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char*)&multiCast, sizeof(multiCast));
	if (iRet != 0) {
		printf("setsockopt fail:%d", WSAGetLastError());
		return -1;
	}

	printf("udp group start\n");

	int len = sizeof(sockaddr);
	char strRecv[1024] = { 0 };
	while (true)
	{
		memset(strRecv, 0, sizeof(strRecv));
		iRet = recvfrom(sock, strRecv, sizeof(strRecv) - 1, 0, (sockaddr*)&addr, &len);
		if (iRet <= 0) {
			printf("recvfrom fail:%d", WSAGetLastError());
			return -1;
		}
		printf("recv data:%s\n", strRecv);
	}

	closesocket(sock);
	WSACleanup();

	return 0;
}

组播发送和接收结果

4.Qt测试组播接收和发送

打开Qt自带的组播发送和接收例程,如图所示
左边为接受例程,右边为发送例程
接收程序修改以下两行代码:

udpSocket->bind(QHostAddress("192.168.4.184"),8119, QUdpSocket::ShareAddress);//本机IP和接收端口
bool res = udpSocket->joinMulticastGroup(QHostAddress("224.2.2.1"));//加入组播组

发送程序修改以下代码

udpSocket->writeDatagram(datagram, QHostAddress("224.16.132.22"), 8119);

5.SocketTool工具测试

网络测试工具中SocketTool对组播比较好。SocketTool只能在“224.0.0.1”地址上发送数据,其他地址只能用来接收测试,配置如图所示:
在输入框中输入组播IP和端口,可以看到数据滚动
SocketTool链接:
链接:https://pan.baidu.com/s/1IK8e_8evyFaV2UXewF2ogg
提取码:gft1

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值