1.配置组播协议
点击添加,安装列表的协议,随后可以看到如下所示
2.配置注册列表
- 按下win+R打开,输入regedit;
- 依次展开HKEY_LOCAL_MACHINE——SYSTEM——CurrentControlSet——Service——Tcpip;
- 选择Parameters;
- 找到IGMPLevel和IGMPVersion两个变量;如果没有,则新建这两个变量,类型为字符串值,值分别为2和3;
- 重启电脑。
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”地址上发送数据,其他地址只能用来接收测试,配置如图所示:
SocketTool链接:
链接:https://pan.baidu.com/s/1IK8e_8evyFaV2UXewF2ogg
提取码:gft1