Я пытаюсь реализовать приложение, которое получает пакет (возможно, 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 ??
}
ДВА ВОПРОСА:
Теперь, когда я получаю что-то при выборе, как мне узнать, на какой интерфейс крана прибыл пакет?
Также, как я могу проверить этот код. У меня есть этот интерфейс UP, как мне вводить пакеты, чтобы эта функция приема работала? Кто-нибудь может дать команду? ping должен работать (отправляет ICMP-пакет). Какая правильная команда. Я пробовал "ping -I tap0 localhost"