我認為必須有一種方法可以向 Windows 詢問有關當前連接網路的網路配接器的資訊(可用的單播/多播,是 Wi-Fi,名稱等)
當我說已連接時,我的意思是當前的 Wi-Fi 連接(如 windows)在 Wi-Fi 選項中向您顯示 - 連接的定義在網路世界中可能不同
即使它只是可能的介面索引,因為使用GetAdaptersAddresses()etc查找大多數其他內容很容易
如果這是一個 x/y 問題:我正在嘗試將其作為撰寫 mdns 客戶端的一部分(出于學術目的,我知道 windows 有一個 mdns api)。我只想在當前的 Wi-Fi 網路上廣播和接收(我認為您需要在其中設定IP_ADD_SOURCE_MEMBERSHIP標志setsockopt),然后我還需要知道回傳 mdns 回應的 IP 地址
我可以設定IP_ADD_MEMBERSHIP,但我仍然需要找出要回傳的 IP,如果事情在單個網路上作業(或者我認為),一切都會在概念上變得更容易
uj5u.com熱心網友回復:
將為您提供系統上的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: %s\n", curr->AdapterName);
printf("interface address: %s\n", addrstr);
}
}
}
free(head);
這里的一個重要注意事項是,可能有不止一個無線介面處于活動狀態。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/512757.html
標籤:C C温纳皮联网多播
上一篇:我對GetPriorityClass函式(和[in]屬性)的引數有疑問
下一篇:如何正確初始化COM物件?
