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

Я пытаюсь реализовать приложение, которое получает пакет (возможно, 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, как мне вводить пакеты, чтобы эта функция приема работала? Кто-нибудь может дать команду? ping должен работать (отправляет ICMP-пакет). Какая правильная команда. Я пробовал "ping -I tap0 localhost"


person Curious Guy 007    schedule 21.03.2014    source источник


Ответы (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
  }
}
person Rags    schedule 21.03.2014

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

Настройте один сокет на каждый интерфейс и получайте данные с обоих сокетов.

person harper    schedule 21.03.2014

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

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

person Ankit Kumar    schedule 21.03.2014
comment
Тогда как я могу слушать на нескольких интерфейсах одновременно. Я думал, именно поэтому мы используем select в первую очередь. - person Curious Guy 007; 21.03.2014
comment
select предназначен для облегчения обнаружения файлового дескриптора read/write ready. в основном вам не нужно блокировать FDs - person Ankit Kumar; 21.03.2014