绑定与SO_BINDTODEVICE套接字 [英] bind vs SO_BINDTODEVICE socket

查看:151
本文介绍了绑定与SO_BINDTODEVICE套接字的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在linux(ubuntu 13.10)上运行一个项目,该项目使用原始套接字连接到设备.

I'm running a project on linux (ubuntu 13.10) which uses raw socket connecting to a device.

这是我的代码:

/* 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如下:

However I have 2 NIC cards on my computer and I would like to listen only to one of them. lets say etho. I found two options bind and SO_BINDTODEVICE as follows:

/* 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;
}

仅绑定有效.所以我的问题是两者之间有什么区别?

Only bind works. So my question is what is the difference between the two ?

推荐答案

来自Linux手册页 man 7 socket 用于套接字选项SO_BINDTODEVICE:

From the Linux man-page man 7 socket for socket option SO_BINDTODEVICE:

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

Note that this works only for some socket types, particularly AF_INET sockets. It is not supported for packet sockets (use normal bind(2) there).

这篇关于绑定与SO_BINDTODEVICE套接字的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆