UDP组播配置

2025-10-20 05:49:09 世界杯冠军最多

1.配置组播协议

点击添加,安装列表的协议,随后可以看到如下所示

2.配置注册列表

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

3.测试组播功能

发送代码:

#include "pch.h"

#include

#include

#include

#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

#include

#include

#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”地址上发送数据,其他地址只能用来接收测试,配置如图所示:

SocketTool链接:

链接:https://pan.baidu.com/s/1IK8e_8evyFaV2UXewF2ogg

提取码:gft1