質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Objective-C

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

4342閲覧

iosアプリ(swift/Object-C)でデフォルトゲートウェイのIPアドレスを取得

yamayamak

総合スコア131

Objective-C

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2017/04/30 07:47

iPhone(ios)のアプリのプログラム(swift/Object-C)でデフォルトゲートウェイのIPアドレスを取得したいですが、やり方がわかりません。

色々調べてやってみていますが、C言語でルート取得してデフォルトゲートウェイのIPアドレスを取得する?とかはあるんですが、やってますが取得できません。
どなたかアドバイスをお願いします。

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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

yamayamak

総合スコア131

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問