绑定vs SO_BINDTODEVICE套接字

时间:2013-11-27 10:45:19

标签: c linux sockets

我在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 个答案:

答案 0 :(得分:11)

从Linux手册页man 7 socket获取套接字选项SO_BINDTODEVICE:

  

请注意,这仅适用于某些套接字类型,尤其是   AF_INET       插座。数据包套接字不支持(使用正常       bind(2)那里。

答案 1 :(得分:1)

这是工作版。

{
struct ifreq if_bind;
strncpy(if_bind.ifr_name, ifName.c_str(), IFNAMSIZ);

if(setsockopt(sock, SOL_SOCKET, SO_BINDTODEVICE, (char *)&if_bind,  sizeof(if_bind)) < 0) {
        }
}