gpt4 book ai didi

c++ - 如何获取本地网络上所有设备的名称和 ips?

转载 作者:太空宇宙 更新时间:2023-11-04 14:12:40 25 4
gpt4 key购买 nike

我的目标是列出本地网络上所有设备的名称和 ip。

list all the computer names on a local network on iPhone类似于这篇文章,但没有得到回答。

我研究过 Apples Bonjour,我认为这不是我需要的。它不会显示网络上的所有设备。

我也试过下面的代码,但我得到了奇怪的输出(如下)。

int sock;
struct ifconf ifconf;
struct ifreq ifreq[30];
int interfaces;
int i;

// Create a socket or return an error.
sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock < 0)
diep("socket");

// Point ifconf's ifc_buf to our array of interface ifreqs.
ifconf.ifc_buf = (char *) ifreq;

// Set ifconf's ifc_len to the length of our array of interface ifreqs.
ifconf.ifc_len = sizeof ifreq;

// Populate ifconf.ifc_buf (ifreq) with a list of interface names and addresses.
if (ioctl(sock, SIOCGIFCONF, &ifconf) == -1)
diep("ioctl");

// Divide the length of the interface list by the size of each entry.
// This gives us the number of interfaces on the system.
interfaces = ifconf.ifc_len / sizeof(ifreq[0]);

// Print a heading that includes the total # of interfaces.
printf("IF(%d)\tIP\n", interfaces);

// Loop through the array of interfaces, printing each one's name and IP.
for (i = 0; i < interfaces; i++) {
char ip[INET_ADDRSTRLEN];
struct sockaddr_in *address = (struct sockaddr_in *) &ifreq[i].ifr_addr;

// Convert the binary IP address into a readable string.
if (!inet_ntop(AF_INET, &address->sin_addr, ip, sizeof(ip)))
diep("inet_ntop");

printf("FOUND: %s\t%s\n", ifreq[i].ifr_name, ip);
}

close(sock);

这是输出,我真的无法理解。

FOUND: lo0  24.3.0.0
FOUND: 28.30.0.0
FOUND: 0.0.0.0
FOUND: 0.0.0.0
FOUND: 0.0.0.1
FOUND: ip0 112.100.112.95
FOUND: pdp_ip1 255.7.0.0
FOUND: 20.18.4.0
FOUND: ip2 0.0.0.0
FOUND: ap1\256\372\272J\221\253 0.0.0.0
FOUND: 105.112.50.0
FOUND: 254.74.145.171
FOUND: ip2 0.0.0.0
FOUND: ip2 101.110.49.142
FOUND: awdl0 6.5.6.0
FOUND: \273Y\311 28.30.0.0

我希望看到这样的输出:

My-Mac    192.168.0.21
My-iPad 192.168.0.22
Mum's iPhone 192.168.0.23

使用 Objective-C 或 C++ 的解决方案会很有用。谢谢。

最佳答案

刚刚再次挖掘这个项目...这是我尝试按照@PRSingh 的要求分享代码...希望它有所帮助。

在我的.h中定义

 NSNetServiceBrowser *serviceBrowser;
NSNetService *service;
NSMutableArray* snames;
NSMutableArray* sips;
UIActivityIndicatorView* spinner;

在我的.m

#pragma mark - NSNetServiceDelegate Methods

- (void)netServiceWillResolve:(NSNetService *)sender {
NSLog(@"netServiceWillResolve");

serviceBrowser = [[NSNetServiceBrowser alloc] init];
if(!serviceBrowser) {
NSLog(@"The NSNetServiceBrowser couldn't be allocated and initialized.");
}
serviceBrowser.delegate = self;
[serviceBrowser searchForServicesOfType:@"_type._tcp." inDomain:@"local."];
}

- (void)netServiceWillPublish:(NSNetService *)netService
{
NSLog(@"netServiceWillPublish");
}

- (void)netServiceDidPublish:(NSNetService *)sender {
NSLog(@"netServiceDidPublish");
}

- (void)netService:(NSNetService *)sender didNotPublish:(NSDictionary *)errorDict {
NSLog(@"didNotPublish");
}

- (void)netServiceDidResolveAddress:(NSNetService *)netService {
NSLog(@"netServiceDidResolveAddress");
for (NSData* data in [netService addresses]) {

char addressBuffer[100];

struct sockaddr_in* socketAddress = (struct sockaddr_in*) [data bytes];

int sockFamily = socketAddress->sin_family;

if (sockFamily == AF_INET /*|| sockFamily == AF_INET6*/) {

const char* addressStr = inet_ntop(sockFamily,
&(socketAddress->sin_addr), addressBuffer,
sizeof(addressBuffer));

// int port = ntohs(socketAddress->sin_port);

if (addressStr){
if(![sips containsObject:[NSString stringWithFormat:@"%s",addressStr]]){
[snames addObject:netService.name];
[sips addObject:[NSString stringWithFormat:@"%s",addressStr]];
[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationFade];
}
}

}

}
}

- (void)netService:(NSNetService *)sender didNotResolve:(NSDictionary *)errorDict {
NSLog(@"didNotResolve: %@",errorDict);
}

- (void)netService:(NSNetService *)sender didUpdateTXTRecordData:(NSData *)data {
NSLog(@"didUpdateTXTRecordData");
}

- (void)netServiceDidStop:(NSNetService *)netService {
NSLog(@"netServiceDidStop");
}

#pragma mark - NSNetServiceBrowserDelegate Methods

- (void)netServiceBrowser:(NSNetServiceBrowser *)netServiceBrowser didFindService:(NSNetService *)netService moreComing:(BOOL)moreServicesComing {
NSLog(@"didFindService: %@ lenght:%d",netService.name,[netService.name length]);
[services addObject:netService];
}


- (void)netServiceBrowser:(NSNetServiceBrowser *)netServiceBrowser didRemoveService:(NSNetService *)netService moreComing:(BOOL)moreServicesComing {
[services removeObject:netService];
[netService stop];
int index = [snames indexOfObject:netService.name];
[snames removeObjectAtIndex:index];
[sips removeObjectAtIndex:index];
[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationFade];

NSLog(@"didRemoveService");
}

为此,我相信网络上的所有设备都需要使用“_type_.tcp”(或您给它的任何名称)的“类型”运行 bonjour。您可以尝试使用该类型来查看您本地网络上的哪些设备已经使用了某些服务类型 (https://developer.apple.com/library/mac/qa/qa1312/_index.html)。

关于c++ - 如何获取本地网络上所有设备的名称和 ips?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13411789/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com