#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <winsock.h>
#pragma comment(lib, "ws2_32.lib")
#define close closesocket
#undef IP_ADD_MEMBERSHIP
#define IP_ADD_MEMBERSHIP 12
int main(void)
{
WSADATA wsa={0};
WSAStartup(MAKEWORD(2,2),&wsa);
SOCKET fd;
SOCKADDR_IN localif;
fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (fd == -1) {
perror("socket");
return -1;
}
localif.sin_family = AF_INET;
localif.sin_port = htons(1234);
localif.sin_addr.s_addr = htonl(INADDR_ANY);
if (bind(fd, (SOCKADDR *)&localif, sizeof(localif)) == -1) {
perror("bind");
return -1;
}
int ttl = 1;
if (setsockopt(fd, IPPROTO_IP, IP_MULTICAST_TTL, (char *)&ttl, sizeof(ttl)) == SOCKET_ERROR) {
printf("setsockopt IP_MULTICAST_TTL %d", WSAGetLastError());
return -1;
}
struct ip_mreq mreq;
memset(&mreq, 0, sizeof(mreq));
mreq.imr_interface.s_addr = inet_addr("192.168.1.145");
mreq.imr_multiaddr.s_addr = inet_addr("234.0.0.1"); //234.5.6.7
if (setsockopt(fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&mreq, sizeof(mreq)) == -1) {
printf("setsockopt IP_ADD_MEMBERSHIP %d", WSAGetLastError());
return -1;
}
while (true) {
char buf[1024] = {0};
int n = recv(fd, buf, sizeof(buf), 0);
if (n == -1) {
perror("recv");
return -1;
}
buf[n] = 0;
printf("%s", buf);
}
if (setsockopt(fd, IPPROTO_IP, IP_DROP_MEMBERSHIP, (char *)&mreq, sizeof(mreq)) == -1) {
printf("setsockopt IP_DROP_MEMBERSHIP %d", WSAGetLastError());
return -1;
}
WSACleanup();
return 0;
}