13

我有一个程序,它有两个独立的部分:一个应该在网络接口是无线 LAN 时执行,另一个应该在它是有线 LAN 连接时执行。我怎么能在我的程序中知道这一点?我应该使用什么功能来获取该信息?

4

4 回答 4

9

如果您的设备名称是NETDEVICE,则检查/sys/class/net/NETDEVICE/wireless目录是否存在是您可以使用的谓词。不过,这是一种仅限 Linux 的方法,它假定/sys已安装,这几乎总是正常情况。从脚本中使用这种方法也更容易,而不是处理 ioctl()s。

于 2012-09-24T14:34:19.087 回答
8

您可以从命令行使用 iwconfig 命令:

$ iwconfig
lo        no wireless extensions.
eth0      no wireless extensions.

如果您需要从 C 中使用它,正如上面@opaque 的链接所解释的那样,获取源代码或使用 strace 来查看您需要使用哪个 ioctls():

ioctl(3, SIOCGIWNAME, 0x7fff82c0d040)   = -1 EOPNOTSUPP (Operation not supported)
ioctl(3, SIOCGIFFLAGS, {ifr_name="lo", ifr_flags=IFF_UP|IFF_LOOPBACK|IFF_RUNNING}) = 0
write(2, "lo        no wireless extensions"..., 35lo        no wireless extensions.

) = 35
ioctl(3, SIOCGIWNAME, 0x7fff82c0d040)   = -1 EOPNOTSUPP (Operation not supported)
ioctl(3, SIOCGIFFLAGS, {ifr_name="eth0", ifr_flags=IFF_UP|IFF_BROADCAST|IFF_RUNNING|IFF_MULTICAST}) = 0
write(2, "eth0      no wireless extensions"..., 35eth0      no wireless extensions.

) = 35

请参阅SIOCGIWNAME 用法

#define SIOCGIWNAME 0x8B01 /* get name == wireless protocol */
/* SIOCGIWNAME is used to verify the presence of Wireless Extensions.
* Common values : "IEEE 802.11-DS", "IEEE 802.11-FH", "IEEE 802.11b"...
于 2012-09-24T14:31:49.033 回答
8

您可以调用ioctl(fd, SIOCGIWNAME)它返回无线扩展协议版本,该版本仅在无线接口上可用。

int check_wireless(const char* ifname, char* protocol) {
  int sock = -1;
  struct iwreq pwrq;
  memset(&pwrq, 0, sizeof(pwrq));
  strncpy(pwrq.ifr_name, ifname, IFNAMSIZ);

  if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
    perror("socket");
    return 0;
  }

  if (ioctl(sock, SIOCGIWNAME, &pwrq) != -1) {
    if (protocol) strncpy(protocol, pwrq.u.name, IFNAMSIZ);
    close(sock);
    return 1;
  }

  close(sock);
  return 0;
}

有关完整示例,请参见:https ://gist.github.com/edufelipe/6108057

于 2013-07-29T21:44:44.140 回答
1

如果您以 NetworkManager 为目标,请查看其 API、C 示例NMDeviceType

于 2012-09-24T14:35:25.360 回答