Как получить интерфейс, к которому я подключен

Я пытаюсь реализовать приложение, которое получает пакет (возможно, ICMP) на интерфейсе крана. У меня есть код что-то вроде этого.

strcpy(ifName, "tap0");
if ((sockfd = socket(PF_PACKET, SOCK_RAW,0) == -1) {
    perror("ERROR: socket");    
}
retVal = setsockopt(sockfd, SOL_SOCKET,  SO_REUSEADDR,
                        (char *)&sockopt, sizeof(sockopt)); // int sockopt

setsockopt(sockfd, SOL_SOCKET,SO_BINDTODEVICE, ifName, IFNAMSIZ-1);
max_sd = sockfd;
FD_SET(sockfd, &readfds);
// Similarly I have other fd's for tap1 and tap2 set to this &readfds

timeout.tv_sec  = 30;
timeout.tv_usec = 0;

retVal = select(max_sd + 1, &readfds, NULL,NULL,&timeout);

if(retVal == 1){
    // Now I know I got some message on one of the tap interface. How do I find out which
one ??
}

ДВА ВОПРОСА:

  1. Теперь, когда я получаю что-то по выбору, как мне узнать, по какому интерфейсу крана поступил пакет?

  2. Также, как я могу проверить этот код. У меня есть эти интерфейсы UP, как я могу ввести пакеты, чтобы эта функция приема работала? Кто-то может дать команду? Пинг должен работать (он отправляет ICMP-пакет). Какая правильная команда. Я попробовал "ping -I tap0 localhost"

3 ответа

Решение

Вы можете иметь список сохраненных fd. Просто пример кода

 // say you have 5 fd save in FD[] // have a mapping from fd's to tap interfaces
 // fd[1] -- tap1
 //fd[2] -- tap2 something like this
for(int i=0;i<5;i++){
   if(FD_ISSET(fd[i],&readfd)){
     //you have the fd, look up corresponding interface
  }
}

Вы не можете узнать, к какому адаптеру (или интерфейсу) приходит пакет с одним сокетом.

Установите один сокет для интерфейса и получите оба сокета.

Тебе нужно открыть multiple socketsпо одному на каждый интерфейс. пакет, полученный на одном интерфейсе, не будет виден на любом другом интерфейсе.:)

Есть отдельные RecvQ/TransQ для каждого интерфейса.

Другие вопросы по тегам