Код: Выделить всё
#include
#include
#include
#include
#include
#include
#define PORT 60000
#define MULTICAST_IP "239.1.0.1"
#define BUFFER_SIZE 1024
int main(int argc, char const *argv[]) {
int sockfd;
struct sockaddr_in servaddr, cliaddr;
struct ip_mreq mreq;
char buffer[BUFFER_SIZE];
if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
perror("socket creation failed");
exit(EXIT_FAILURE);
}
memset(&servaddr, 0, sizeof(servaddr));
memset(&cliaddr, 0, sizeof(cliaddr));
servaddr.sin_family = AF_INET;
//servaddr.sin_addr.s_addr = INADDR_ANY;
servaddr.sin_addr.s_addr = inet_addr("192.168.1.11");
servaddr.sin_port = htons(PORT);
if (bind(sockfd, (const struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) {
perror("bind failed");
close(sockfd);
exit(EXIT_FAILURE);
}
mreq.imr_multiaddr.s_addr = inet_addr(MULTICAST_IP);
mreq.imr_interface.s_addr = inet_addr("192.168.1.11");
if (setsockopt(sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)) < 0) {
perror("setsockopt failed");
close(sockfd);
exit(EXIT_FAILURE);
}
socklen_t len = sizeof(cliaddr);
char addr[17] = {0};
int n = recvfrom(sockfd, (char *)buffer, BUFFER_SIZE, MSG_WAITALL, (struct sockaddr *)&cliaddr, &len);
buffer[n] = '\0';
inet_ntop(AF_INET, &cliaddr.sin_addr, addr, static_cast(sizeof(addr)));
printf("Multicast message from %s received: %s\n", addr, buffer);
close(sockfd);
return 0;
}
Из этого ответа кажется, что я могу привязать только INADDR_ANY и фильтруйте многоадресный трафик с помощью setockopt с опцией IP_ADD_MEMBERSHIP. Это правильно?
Спасибо.
Подробнее здесь: https://stackoverflow.com/questions/793 ... twork-inte