ho cercato un modo per ottenere l'indirizzo IP del predefinito me stesso gateway. Mi concentrerò solo su questo - non ho bisogno di ottenere l'indirizzo MAC del router predefinito, quindi questo risponde solo parzialmente alla domanda dell'OP.
Non mi piaceva l'idea di analizzare l'output di netstat. Inoltre, non è possibile ottenere una route predefinita in base all'indirizzo IP di cui dispone un'interfaccia sulla macchina. Qualsiasi indirizzo IP compreso nello stesso intervallo può essere un gateway predefinito: l'unica regola è che sia l'IP che il gateway predefinito devono far parte della stessa subnet.
Un'altra cosa che volevo garantire è ottenere un indirizzo IP del gateway predefinito anche se a più di una delle mie interfacce locali è stato assegnato un indirizzo IP (ad es. Sono connesso al Wifi e al cavo Ethernet allo stesso tempo, e entrambe le interfacce sono attive, con un indirizzo IP su di esse). Per la mia applicazione, non importa quale interfaccia viene impostata la route predefinita (può essere en0, en1, ppp0 o qualsiasi altra cosa).
Penso che il modo migliore (e più simile ad Apple) per ottenere informazioni sia l'utilizzo di System Configuration Framework: i collegamenti nel post in alto in questo thread mi hanno indirizzato in quella direzione, ma in realtà non mi hanno dato molti dettagli su come usarlo, e non ho trovato la documentazione di Apple su di esso molto utile (almeno prendendo in considerazione il mio livello di abilità).
Per favore, non sono molto esperto in Objective-C - Sono nel mezzo di scrivere un'app di cui ho bisogno (e che non ho trovato), e per quell'app ho solo bisogno dell'IP indirizzo del gateway predefinito.
Quindi - ecco quello che sto facendo nella mia app, e sembra funzionare bene (più è molto più breve e più semplice rispetto alla maggior parte di altre soluzioni che ho trovato finora:
- (NSString *)defaultRouter {
SCDynamicStoreRef ds = SCDynamicStoreCreate(kCFAllocatorDefault, CFSTR("myapp"), NULL, NULL);
CFDictionaryRef dr = SCDynamicStoreCopyValue(ds, CFSTR("State:/Network/Global/IPv4"));
CFStringRef router = CFDictionaryGetValue(dr, CFSTR("Router"));
NSString *routerString = [NSString stringWithString:(__bridge NSString *)router];
CFRelease(dr);
CFRelease(ds);
return routerString;
}
Si prega di notare che in la mia app, la precedente, fa parte di un metodo più grande (in realtà non ho un defaultRouter: metodo in là) Inoltre, ho omesso alcuni dei controlli (come [lunghezza di routerString] e così via) per brevità
Speriamo che qualcuno lo trovi utile, per favore sentitevi liberi di correggere eventuali errori che potrei avere nel codice qui sopra - Sono ancora un novellino!
PS. Ho avuto un'idea di cosa cercare quando ho controllato l'uscita di 'scutil', che utilizza il Framework Configuration Sistema stesso:
MacBook:~$ scutil
> show State:/Network/Global/IPv4
<dictionary> {
PrimaryInterface : en1
PrimaryService : <service_id>
Router : <ipv4_address>
}
> show State:/Network/Global/IPv6
<dictionary> {
PrimaryInterface : en1
PrimaryService : <service_id>
Router : <ipv6_address>
}
ifa-> ifa_dstaddr è l'indirizzo di broadcast, che spiega la "255 del". – Bill
controlla questo link potrebbe esserti utile http://stackoverflow.com/questions/6530322/fetching-ip-address-of-router-to-which-iphone-is-connessione –