Могу ли я связать IP и порт с получением многоадресного трафика из конкретного сетевого интерфейсаC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Могу ли я связать IP и порт с получением многоадресного трафика из конкретного сетевого интерфейса

Сообщение Anonymous »

На Linux я хочу получить многоадресный трафик только от определенного интерфейса. Таким образом, я привязываю интерфейс и порт с сокетом , затем присоединяюсь к параметре многоадресной группы по SetSockopt с помощью ip_add_membership . Вот код: < /p>

Код: Выделить всё

#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;
}

Я не могу получить многоадресный трафик группы 239.1.0.1, исходящий от 192.168.1.11. Если я привязываю INADDR_ANY вместо 192.168.1.11, он работает так, как ожидалось.
Из этого ответа кажется, что я могу привязать только INADDR_ANY и фильтруйте многоадресный трафик с помощью setockopt с опцией IP_ADD_MEMBERSHIP. Это правильно?
Спасибо.

Подробнее здесь: https://stackoverflow.com/questions/793 ... twork-inte
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»