И так, у меня есть проблема. Сервер вещает данные в UDP Multicast группу. Клиент подключается к нем и получает данные. Изменяем адрес группы (меняем IP, но не меняем порт) и клиент все равно получает данные.
Написал простенький receiver и пытаюсь в нем узнать из полученной дейтаграмма группу в которую он была отправлена. Что бы воочию увидеть что у меня сервер что то не правильно шлет или еще что то.
Не получается. Создаю сокет и настраиваю на UDP Multicast.
sockfd = socket(AF_INET, SOCK_DGRAM, 0)
setsockopt(sockfd, IPPROTO_IP, IP_PKTINFO, &optval, sizeof(optval)
char msg_buf[300];
struct iovec iov; // структура сообщения
iov.iov_base = msg_buf; // указываем buf в качестве буфера сообщения для iov
iov.iov_len = sizeof(msg_buf); // указываем размер буфера
struct cmsghdr *cmsgptr;
struct sockaddr_in cliaddr;
msghdr msg;
msg.msg_name = &cliaddr; // задаем имя - структуру локального адреса
msg.msg_namelen = sizeof(cliaddr);
msg.msg_iov = &iov; // указываем вектор данных сообщения
msg.msg_iovlen = 1;
recvmsg(receiver, &msg, 0)
for (cmsgptr = CMSG_FIRSTHDR(&msg); cmsgptr != NULL; cmsgptr = CMSG_NXTHDR(&msg, cmsgptr))
{
std::cout << "Ohhh...\n";
struct in_pktinfo *pi = (struct in_pktinfo* )CMSG_DATA(cmsgptr);
// at this point, peeraddr is the source sockaddr
// pi->ipi_spec_dst is the destination in_addr
// pi->ipi_addr is the receiving interface in_addr
std::cout << inet_ntoa(pi->ipi_spec_dst) << std::endl;
}
Подумал, что может быть при отправке не указывается нужные данные. Но Wariesshark под виндой для моих дейтаграм корректно указывает Destination.