Чтение с разнородного сетевого устройства только с одного порта

Я использую приведенный ниже код для интерфейса []="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);

.....

Что я делаю не так? Спасибо за помощь

0 ответов

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