Чтение с разнородного сетевого устройства только с одного порта
Я использую приведенный ниже код для интерфейса []="enp1s0" (Скопировано из [ Чтение с разнородного сетевого устройства). Он работает для enp1s0, как и ожидалось, и получает все протоколы, когда сетевой кабель подключается к enp1s0 . Но если у меня подключен кабель в программу enp2s0 тоже получает данные из интерфейса enp2s0 (я ожидаю, что ничего не получу от enp2s0) . Это значит, что мой нюхает не только интерфейс enp1s0!!!, Я тоже попробовал setsockopt, но это тоже не сработало. Как я могу установить Socket для всех протоколов только и получать только от enp1s0? Вот код
int raw_init (const char *device)
{
struct ifreq ifr;
int raw_socket;
memset (&ifr, 0, sizeof (struct ifreq));
/* Open A Raw Socket */
if ((raw_socket = socket (PF_PACKET, SOCK_RAW, htons (ETH_P_ALL))) < 1)
{
printf ("ERROR: Could not open socket, Got #?\n");
exit (1);
}
/* Set the device to use */
strcpy (ifr.ifr_name, device);
/* Get the current flags that the device might have */
if (ioctl (raw_socket, SIOCGIFFLAGS, &ifr) == -1)
{
perror ("Error: Could not retrive the flags from the device.\n");
exit (1);
}
/* Set the old flags plus the IFF_PROMISC flag */
ifr.ifr_flags |= IFF_PROMISC;
if (ioctl (raw_socket, SIOCSIFFLAGS, &ifr) == -1)
{
perror ("Error: Could not set flag IFF_PROMISC");
exit (1);
}
printf ("Entering promiscuous mode\n");
/* Configure the device */
if (ioctl (raw_socket, SIOCGIFINDEX, &ifr) < 0)
{
perror ("Error: Error getting the device index.\n");
exit (1);
}
return raw_socket;
}
и главное
const char Interface[]="enp1s0";
int main(int argc, char *argv[])
{
int saddr_size ;
socklen_t data_size;
struct sockaddr saddr;
while(1)
{
sock_raw=raw_init (Interface);
unsigned char *buffer = (unsigned char *)malloc(65535); //Its Big!
saddr_size = sizeof saddr;
data_size =recvfrom(sock_raw , buffer , 65535 , 0 ,(struct sockaddr *) &saddr,(socklen_t*) &saddr_size);
.....
Что я делаю не так? Спасибо за помощь