iPhone(ios)のアプリのプログラム(swift/Object-C)でデフォルトゲートウェイのIPアドレスを取得したいですが、やり方がわかりません。
色々調べてやってみていますが、C言語でルート取得してデフォルトゲートウェイのIPアドレスを取得する?とかはあるんですが、やってますが取得できません。
どなたかアドバイスをお願いします。
よろしくお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答1件
0
自己解決
かっこよくないですが以下でできました。
swiftからObject-Cにブリッジして、C言語でデフォルトゲートウェイを取得しました。
C言語はルーティングを取得して、その中からデフォルトゲートウェイIPを取得しているようです。(以下参照)
http://stackoverflow.com/questions/4872196/how-to-get-the-wifi-gateway-address-on-the-iphone/9173849#9173849
以下が実施した内容です。
swift3
1// 現在のGateWayを取得 2let getGwIp = getDefGwObjC() 3let out = getGwIp.getGatewayIP() 4print(out!)
XcodeのメニューのFile > New > Fileを選択し、iOSのCocoa Touch Classを選択し、
クラス名:任意(今回は「getDefGwObjC」)や親クラス:NSObject、言語:Objective-C
(ヘッダファイルも同時に作成を選択し以下のように記載)
// getDefGwObjC.mファイル
Object
1#import "getDefGwObjC.h" 2#import "getgateway.h" 3#import <arpa/inet.h> 4 5@implementation getDefGwObjC 6- (NSString *)getGatewayIP { 7 NSString *ipString = nil; 8 struct in_addr gatewayaddr; 9 int r = getdefaultgateway(&(gatewayaddr.s_addr)); 10 if(r >= 0) { 11 ipString = [NSString stringWithFormat: @"%s",inet_ntoa(gatewayaddr)]; 12 NSLog(@"default gateway : %@", ipString ); 13 } else { 14 NSLog(@"getdefaultgateway() failed"); 15 } 16 17 return ipString; 18 19} 20@end
// getDefGwObjC.hファイル
Object
1#import <Foundation/Foundation.h> 2 3@interface getDefGwObjC : NSObject 4- (NSString *)getGatewayIP; 5@end
また、< プロジェクト名>-Bridging-Header.hファイルに以下を追加
swift
1#import "getDefGwObjC.h"
XcodeのメニューのFile > New > Fileを選択し、C言語を選択し作成
C言語
1#include <stdio.h> 2#include <netinet/in.h> 3#include <stdlib.h> 4#include <sys/sysctl.h> 5#include "getgateway.h" 6#include "getDefGwIp.h" 7 8#include "TargetConditionals.h" 9#if TARGET_IPHONE_SIMULATOR 10#include <net/route.h> 11#define TypeEN "en1" 12#else 13#include "route.h" 14#define TypeEN "en0" 15#endif 16 17#include <net/if.h> 18#include <string.h> 19 20#define CTL_NET 4 /* network, see socket.h */ 21 22 23#if defined(BSD) || defined(__APPLE__) 24 25#define ROUNDUP(a) \ 26((a) > 0 ? (1 + (((a) - 1) | (sizeof(long) - 1))) : sizeof(long)) 27 28int getdefaultgateway(in_addr_t * addr) 29{ 30 int mib[] = {CTL_NET, PF_ROUTE, 0, AF_INET, 31 NET_RT_FLAGS, RTF_GATEWAY}; 32 size_t l; 33 char * buf, * p; 34 struct rt_msghdr * rt; 35 struct sockaddr * sa; 36 struct sockaddr * sa_tab[RTAX_MAX]; 37 int i; 38 int r = -1; 39 if(sysctl(mib, sizeof(mib)/sizeof(int), 0, &l, 0, 0) < 0) { 40 return -1; 41 } 42 if(l>0) { 43 buf = malloc(l); 44 if(sysctl(mib, sizeof(mib)/sizeof(int), buf, &l, 0, 0) < 0) { 45 return -1; 46 } 47 for(p=buf; p<buf+l; p+=rt->rtm_msglen) { 48 rt = (struct rt_msghdr *)p; 49 sa = (struct sockaddr *)(rt + 1); 50 for(i=0; i<RTAX_MAX; i++) { 51 if(rt->rtm_addrs & (1 << i)) { 52 sa_tab[i] = sa; 53 sa = (struct sockaddr *)((char *)sa + ROUNDUP(sa->sa_len)); 54 } else { 55 sa_tab[i] = NULL; 56 } 57 } 58 59 if( ((rt->rtm_addrs & (RTA_DST|RTA_GATEWAY)) == (RTA_DST|RTA_GATEWAY)) 60 && sa_tab[RTAX_DST]->sa_family == AF_INET 61 && sa_tab[RTAX_GATEWAY]->sa_family == AF_INET) { 62 63 64 if(((struct sockaddr_in *)sa_tab[RTAX_DST])->sin_addr.s_addr == 0) { 65 char ifName[128]; 66 if_indextoname(rt->rtm_index,ifName); 67 if(strcmp(TypeEN,ifName)==0){ 68 *addr = ((struct sockaddr_in *)(sa_tab[RTAX_GATEWAY]))->sin_addr.s_addr; 69 r = 0; 70 } 71 } 72 } 73 } 74 free(buf); 75 } 76 return r; 77} 78#endif 79
XcodeのメニューのFile > New > Fileを選択し、ヘッダファイルを選択し作成
getgateway.hファイル
C言語
1int getdefaultgateway(in_addr_t * addr);
以上でswiftから取得できました。
投稿2017/04/30 11:36
総合スコア131
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。