以下是在Windows下使用C++编写的UDP组播接收代码示例:
#include <iostream>
#include <Winsock2.h>
#include <WS2tcpip.h>
#pragma comment(lib, "ws2_32.lib")
#define MAX_BUFFER_SIZE 1024
#define MULTICAST_IP "组播IP地址"
#define MULTICAST_PORT 12345
int main() {
WSADATA wsaData;
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
std::cerr << "Failed to initialize winsock." << std::endl;
return -1;
}
// 创建UDP套接字
SOCKET sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd == INVALID_SOCKET) {
std::cerr << "Failed to create socket: " << WSAGetLastError() << std::endl;
WSACleanup();
return -1;
}
// 设置套接字为组播模式
ip_mreq mreq;
mreq.imr_multiaddr.s_addr = inet_addr(MULTICAST_IP);
mreq.imr_interface.s_addr = INADDR_ANY;
if (setsockopt(sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char*)&mreq, sizeof(mreq)) == SOCKET_ERROR) {
std::cerr << "Failed to set socket option: " << WSAGetLastError() << std::endl;
closesocket(sockfd);
WSACleanup();
return -1;
}
// 绑定套接字到本地地址和端口
sockaddr_in localAddr{};
localAddr.sin_family = AF_INET;
localAddr.sin_port = htons(MULTICAST_PORT);
localAddr.sin_addr.s_addr = INADDR_ANY;
if (bind(sockfd, (struct sockaddr*)&localAddr, sizeof(localAddr)) == SOCKET_ERROR) {
std::cerr << "Failed to bind socket: " << WSAGetLastError() << std::endl;
closesocket(sockfd);
WSACleanup();
return -1;
}
char buffer[MAX_BUFFER_SIZE];
sockaddr_in senderAddr{};
int senderAddrLen = sizeof(senderAddr);
while (true) {
// 接收组播数据
int bytesRead = recvfrom(sockfd, buffer, MAX_BUFFER_SIZE, 0, (struct sockaddr*)&senderAddr, &senderAddrLen);
if (bytesRead == SOCKET_ERROR) {
std::cerr << "Failed to receive data: " << WSAGetLastError() << std::endl;
closesocket(sockfd);
WSACleanup();
return -1;
}
// 在这里对接收到的数据进行处理
// ...
// 打印接收到的数据
buffer[bytesRead] = '\0';
std::cout << "Received data: " << buffer << std::endl;
}
// 关闭套接字
closesocket(sockfd);
WSACleanup();
return 0;
}
请确保将"组播IP地址"替换为实际的组播组IP地址,MULTICAST_PORT替换为实际使用的组播端口。此代码示例使用Windows的Winsock库进行套接字编程,并使用recvfrom函数接收组播数据。您可以根据需要对接收到的数据进行处理,并进行适当的错误处理和资源清理。
请注意,此示例中的代码仅处理单个组播组和接收逻辑,