Суть в следующем. Внешнее устройство отправляет данные на компьютер голыми ethernet кадрами, нужно организовать их прием. Я открываю сокет и пытаюсь привязать его к определённой сетевой карте следующим образом:
Код:
int createSocket(char *dev_name)
{
// Create communication socket and bind it with the specified net interface.
// _in char *dev_name - name of the net interface to use;
// _out int - socket descriptor.
struct sockaddr_ll sock_param;
struct ifreq ifr;
int sockd;
// create socket
sockd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
if (sockd < 0)
{
perror("Can not create raw socket");
return -1;
}
// bind the socket to the specified net interface
memset((void *)&ifr, 0, sizeof(struct ifreq));
sprintf(ifr.ifr_name, "%s", dev_name);
if (setsockopt(sockd, SOL_SOCKET, SO_BINDTODEVICE, (char *)&ifr, sizeof(ifr)) < 0)
{
perror("Can not bind socket to the specified net interface");
close(sockd);
return -1;
}
return sockd;
}Далее я читаю данные из сокета функцией recvfrm, извлекаю MAC адреса и вывожу их на экран. При установке интерфейса eth0 выводятся некие MAC адреса, в т.ч. и моей сетевой карты. На этом интерфейсе у меня инет. А если установить интерфейс eth1, к которому в данный момент ничего не подключено, то выводятся те же адреса, что и в случае с eth0. Но ведь через этот интерфейс нет траффика и ничего не должно выводиться. Почему не осуществляется привязка? Где я не прав?