bind vs SO_BINDTODEVICE сокет

Я запускаю проект на Linux (Ubuntu 13.10), который использует необработанный сокет подключения к устройству.

Вот мой код:

/* builed socket ,*/
if ((sockfd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL))) == -1) {
  perror("listener: socket");
  return -1;
}

/* Set interface to promiscuous mode */
strncpy(ifopts.ifr_name, ifName, IFNAMSIZ-1);
ioctl(sockfd, SIOCGIFFLAGS, &ifopts);
ifopts.ifr_flags |= IFF_PROMISC;
ioctl(sockfd, SIOCSIFFLAGS, &ifopts);

/* Allow the socket to be reused - incase connection is closed prematurely */
if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &sockopt, sizeof sockopt) == -1) {
  perror("setsockopt");
  close(sockfd);
  return -2;
}

Однако у меня на компьютере 2 карты NIC, и я хотел бы прослушать только одну из них. давайте скажем это. Я нашел два варианта bind и SO_BINDTODEVICE следующим образом:

/* option 1. Bind to device */
if (setsockopt(sockfd, SOL_SOCKET, SO_BINDTODEVICE, ifName, IFNAMSIZ-1) == -1)  {
  perror("SO_BINDTODEVICE");
  close(sockfd);
  return -4;
}


/* option 2. Bind to device */
memset(&sock_address, 0, sizeof(sock_address));
sock_address.sll_family = PF_PACKET;
sock_address.sll_protocol = htons(ETH_P_ALL);
sock_address.sll_ifindex = if_nametoindex(ifName);
if (bind(sockfd, (struct sockaddr*) &sock_address, sizeof(sock_address)) < 0) {
  perror("bind failed\n");
  close(sockfd);
  return -4;
}

Работает только привязка. Итак, мой вопрос, в чем разница между этими двумя?

Ответы на вопрос(2)

Ваш ответ на вопрос