Я хочу читать необработанные rnet пакеты из сокета. Эти пакеты приходят из многоадресного потока, к которому я должен присоединиться через IP_ADD_MEMBERSHIP
. К сожалению, RAW-сокеты, по-видимому, не поддерживают присоединение к Multicast-адресам?
struct ip_mreqn mreq;
memset(&mreq, 0, sizeof(struct ip_mreqn));
if(inet_pton(AF_INET, multicast_ip, &mreq.imr_multiaddr.s_addr)) {
/* Local interface address */
memcpy(&mreq.imr_address, &cfg->ifaddr.sin_addr, sizeof(struct in_addr));
mreq.imr_ifindex = cfg->ifindex;
if(setsockopt(cfg->socket_fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(struct ip_mreqn)) < 0) {
fprintf(stderr, "Failed to set `IP_ADD_MEMBERSHIP`: %s\n", strerror(errno));
return;
}
}
Не удалось установить IP_ADD_MEMBERSHIP
: операция с сокетом на не-сокете
cfg->socket_fd = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
Как получить полный пакет rnet, но при этом присоединиться к многоадресным IP-адресам?