7
votes

Objective-C: Comment chercher l'adresse du routeur?

J'ai essayé d'aller chercher l'adresse du routeur de cette façon.

- (NSString *) routerIp {

  NSString *address = @"error";
  struct ifaddrs *interfaces = NULL;
  struct ifaddrs *temp_addr = NULL;
  int success = 0;

  // retrieve the current interfaces - returns 0 on success
  success = getifaddrs(&interfaces);
  if (success == 0)
  {
    // Loop through linked list of interfaces
    temp_addr = interfaces;
    while(temp_addr != NULL)
    {
      if(temp_addr->ifa_addr->sa_family == AF_INET)
      {
        // Check if interface is en0 which is the wifi connection on the iPhone
        if([[NSString stringWithUTF8String:temp_addr->ifa_name] isEqualToString:@"en0"])
        {
          // Get NSString from C String //ifa_addr
          address = [NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *)temp_addr->ifa_dstaddr)->sin_addr)];
        }
      }

      temp_addr = temp_addr->ifa_next;
    }
  }

  // Free memory
  freeifaddrs(interfaces);

  return address;
}


2 commentaires

ifa-> ifa_dstaddr est l'adresse de diffusion, qui explique les "255".


Consultez ce lien peut vous être utile sur Stackoverflow.com/Questtions/6530322/...


3 Réponses :


1
votes

xxx.xxx.255.255 est le masque de sous-réseau. Vous avez besoin de l'adresse de la passerelle.

Voir le tableau 3-10, il y a une entrée pour le routeur au THSI PDF: http://developer.apple.com/mac/ Bibliothèque / Documentation / Réseautage / Conceptuel / SystemConfigframeworks / SystemConfigframeworks.PDF

La version HTML est ici: HTTP : //developer.apple.com/mac/library/documentation/setworking/conceptual/systemconfigframeworks/sc_overview/sc_overview.html


2 commentaires

C'est en fait l'adresse de diffusion, pas le masque de sous-réseau.


Si tel est le cas, c'est un énorme domaine de diffusion. Deux octets de 255 seraient assez gros pour diffuser un peu moins de 2 ^ 16 = 65536 hôtes.



4
votes

Voici un code que j'ai écrit pour trouver les itinéraires de la machine. J'ai copié les appels système du code pour netstat code>. Notez que j'ai été fortement recommandé de le faire, car ces appels système ne sont pas une API pris en charge et peuvent changer à tout moment. Ils ont recommandé que je viens d'analyser la sortie de netstat code>.

CustomRoute.c: P>

#import <Cocoa/Cocoa.h>
#import <net/route.h>
#import <sys/socket.h>
#import <netinet/in.h>
#import <net/if_dl.h>
#import <sys/sysctl.h>

@interface CustomRoute : NSObject {
    struct sockaddr     m_addrs[RTAX_MAX];
    struct rt_msghdr2   m_rtm;
    int                 m_len;      /* length of the sockaddr array */
}

+ (NSMutableArray*) getRoutes;
+ (CustomRoute*) getRoute:(struct rt_msghdr2 *)rtm;

- (void) setAddr:(struct sockaddr*)sa index:(int)rtax_index;

- (NSString*) getDestination;
- (NSString*) getNetmask;
- (NSString*) getGateway;
- initWithRtm: (struct rt_msghdr2*) rtm;


@end


1 commentaires

Il n'est pas normal d'utiliser des bibliothèques et des cadres de Mac OS sur iOS.



10
votes

Je cherche un moyen d'obtenir l'adresse IP de la passerelle par défaut moi-même. Je vais me concentrer sur ceci - je n'avais pas besoin d'obtenir l'adresse MAC du routeur par défaut, cela ne répond donc que partiellement la question de l'OP.

Je n'ai pas aimé l'idée de l'analyse de la sortie Netstat. En outre, vous ne pouvez pas obtenir un itinéraire par défaut basé sur l'adresse IP d'une interface sur votre machine. Toute adresse IP dans la même gamme que vous pouvez être une passerelle par défaut - la seule règle est que votre IP et la passerelle par défaut doivent faire partie du même sous-réseau. P>

Une dernière chose que je voulais vous assurer d'obtenir une adresse IP de la passerelle par défaut, même si plus d'une de mes interfaces locales a une adresse IP attribuée à celle-ci (par exemple, je suis connecté au WiFi et à l'Ethernet câblé en même temps et les deux interfaces sont en place, avec une adresse IP sur eux). Pour ma candidature, peu importe l'interface de l'itinéraire par défaut via (il peut être EN0, EN1, PPP0 ou autre chose du tout). p>

Je pense que le meilleur (et la plupart des pommiers) d'obtenir cette information est d'utiliser le cadre de configuration du système - les liens de la publication ci-dessus dans ce fil m'ont pointé dans cette direction, mais je n'ai pas vraiment Donnez beaucoup de détails sur la façon de l'utiliser, et je n'ai pas trouvé la documentation Apple sur celui-ci très utile (au moins en tenant compte de mon niveau de compétence). P>

Merci de ne pas être très expérimenté dans l'objectif-C - Je suis au milieu de la rédaction d'une application que j'ai besoin de moi-même (et que je n'ai pas pu trouver), et pour cette application, je viens de Besoin de l'adresse IP de la passerelle par défaut. P>

Donc, voici ce que je fais dans mon application, et il semble fonctionner bien (plus est beaucoup plus court et plus simple que la plupart des autres solutions que j'ai trouvées jusqu'à présent: P>

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>
}


3 commentaires

SCDynamicsTorCreate et SCDynamicStorecopyValue n'est pas disponible sur iOS. Cela ne fonctionnera que pour un Mac.


@thegrinner Je n'ai pas essayé ces fonctions, mais ces fonctions sont disponibles sous iOS. Vous pouvez vous assurer que cette commande suivante: nm -m /applications/xcode.app/contents/developer/platforms/iphoneo s.platforms / développeur /sdks/iphoneos8.1.sd k / system / bibliothèque / FRA Meworks / SystemConfig Uration.framework / Sy SteMconfiguration | grep scdynamicstorecreate


Non, ce ne sont pas accessibles au public sur iOS 8.1. Dans scdynamicstore.h: scdynamicstorecreate ... __osx_available_starting (__ Mac _10_1, __ iPhone_na); Tenter de référencer ceux-ci produisant une erreur de compilateur.