正在查找当前连接的网络接口/适配器Windows



我认为必须有一种方法向windows询问有关当前连接网络的网络适配器的信息(可用的单播/多播,是Wi-Fi吗,名称等(

当我说连接时,我的意思是,就像窗口中显示的当前Wi-Fi连接一样,在网络世界中,连接的定义可能不同

即使只是接口索引是可能的,因为使用GetAdaptersAddresses()等很容易查找大多数其他内容

如果这是一个x/y问题:我正试图在编写mdns客户端时这样做(出于学术目的,我知道windows有一个mdnsapi(。我只想在当前的Wi-Fi网络上广播和接收(我认为你需要在setsockopt中设置IP_ADD_SOURCE_MEMBERSHIP标志(,然后我还需要知道返回哪个IP地址到mdns响应

我可以设置IP_ADD_MEMBERSHIP,但之后我仍然需要找出返回哪个IP,如果在单个网络上工作(或者我认为是这样(,那么在概念上一切都会变得更容易

GetAdaptersAddresses将为您提供系统上的网络接口列表,并告诉您每个接口的类型。

在返回的IP_ADAPTER_ADDRESSES列表中,IfType字段告诉接口的类型,无线接口将为IF_TYPE_IEEE80211。然后,当您找到这种类型的接口时,您可以通过FirstUnicastAddress成员遍历分配的地址列表,以加入相关的多播组。

IP_ADAPTER_ADDRESSES *head, *curr;
IP_ADAPTER_UNICAST_ADDRESS *uni;
int buflen, err, i;
buflen = sizeof(IP_ADAPTER_UNICAST_ADDRESS) * 500;  //  enough for 500 interfaces
head = malloc(buflen);
if (!head) exit(1);
if ((err = GetAdaptersAddresses(AF_UNSPEC, 0, NULL, head,
&buflen)) != ERROR_SUCCESS) {
char errbuf[300];
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, err,
0, errbuf, sizeof(errbuf), NULL);
printf("GetAdaptersAddresses failed: (%d) %s", err, errbuf);
free(head);
exit(1);
}
for (curr = head; curr; curr = curr->Next) {
if (curr->IfType != IF_TYPE_IEEE80211) continue;
for (uni = curr->FirstUnicastAddress; uni; uni = uni->Next) {
if (curr->OperStatus == IfOperStatusUp) {
char addrstr[INET6_ADDRSTRLEN];
inet_ntop(uni->Address.lpSockaddr->sa_family, uni->Address.lpSockaddr, 
addrstr, uni->Address.iSockaddrLength);
printf("interface name: %sn", curr->AdapterName);
printf("interface address: %sn", addrstr);
}
}
}
free(head);

这里需要注意的一点是,可能有不止一个无线接口处于活动状态。

最新更新