windows socket 实现 udp组播接收
时间: 2023-12-29 21:03:22 浏览: 37
以下是Windows平台下基于Winsock的UDP组播接收的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <winsock2.h>
#define MULTICAST_IP "224.0.0.1" // 组播IP地址
#define LOCAL_IP "192.168.1.100" // 本地IP地址
#define PORT 8888 // 端口号
#define MAX_BUF_LEN 1024 // 缓冲区大小
int main()
{
// 初始化Winsock
WSADATA wsaData;
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
printf("WSAStartup failed with error code %d\n", WSAGetLastError());
return 1;
}
// 创建套接字
SOCKET sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (sock == INVALID_SOCKET) {
printf("socket failed with error code %d\n", WSAGetLastError());
WSACleanup();
return 1;
}
// 绑定本地IP地址和端口号
struct sockaddr_in localAddr;
localAddr.sin_family = AF_INET;
localAddr.sin_addr.s_addr = inet_addr(LOCAL_IP);
localAddr.sin_port = htons(PORT);
if (bind(sock, (struct sockaddr*)&localAddr, sizeof(localAddr)) == SOCKET_ERROR) {
printf("bind failed with error code %d\n", WSAGetLastError());
closesocket(sock);
WSACleanup();
return 1;
}
// 加入组播组
struct ip_mreq mreq;
mreq.imr_multiaddr.s_addr = inet_addr(MULTICAST_IP);
mreq.imr_interface.s_addr = inet_addr(LOCAL_IP);
if (setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char*)&mreq, sizeof(mreq)) == SOCKET_ERROR) {
printf("setsockopt failed with error code %d\n", WSAGetLastError());
closesocket(sock);
WSACleanup();
return 1;
}
// 接收数据
char buf[MAX_BUF_LEN];
struct sockaddr_in fromAddr;
int fromLen = sizeof(fromAddr);
int recvLen;
while (1) {
recvLen = recvfrom(sock, buf, MAX_BUF_LEN, 0, (struct sockaddr*)&fromAddr, &fromLen);
if (recvLen > 0) {
buf[recvLen] = '\0';
printf("Received message from %s: %s\n", inet_ntoa(fromAddr.sin_addr), buf);
}
}
// 退出组播组
if (setsockopt(sock, IPPROTO_IP, IP_DROP_MEMBERSHIP, (char*)&mreq, sizeof(mreq)) == SOCKET_ERROR) {
printf("setsockopt failed with error code %d\n", WSAGetLastError());
closesocket(sock);
WSACleanup();
return 1;
}
// 关闭套接字
closesocket(sock);
// 清理Winsock
WSACleanup();
return 0;
}
```