接続先のWiFiのゲートウェイIPアドレスを取得しようとしています。このquestionの回答を使用していますが、コードにエラーが発生しています。アーキテクチャarm64の未定義のシンボル: "getdefaultgateway(unsigned int *)"
私は私のプロジェクトで
- (NSString *)getGatewayIP {
NSString *ipString = nil;
struct in_addr gatewayaddr;
int r = getdefaultgateway(&(gatewayaddr.s_addr));
if(r >= 0) {
ipString = [NSString stringWithFormat: @"%s",inet_ntoa(gatewayaddr)];
NSLog(@"default gateway : %@", ipString);
} else {
NSLog(@"getdefaultgateway() failed");
}
return ipString;
}
をこれを使用すると、私は私のプロジェクトをビルドしようとすると、私はこのエラーを取得する:ここで
Undefined symbols for architecture arm64: "getdefaultgateway(unsigned int*)"
はgetgateway.c
int getdefaultgateway(in_addr_t * addr)
{
int mib[] = {CTL_NET, PF_ROUTE, 0, AF_INET,
NET_RT_FLAGS, RTF_GATEWAY};
size_t l;
char * buf, * p;
struct rt_msghdr * rt;
struct sockaddr * sa;
struct sockaddr * sa_tab[RTAX_MAX];
int i;
int r = -1;
if(sysctl(mib, sizeof(mib)/sizeof(int), 0, &l, 0, 0) < 0) {
return -1;
}
if(l>0) {
buf = malloc(l);
if(sysctl(mib, sizeof(mib)/sizeof(int), buf, &l, 0, 0) < 0) {
return -1;
}
for(p=buf; p<buf+l; p+=rt->rtm_msglen) {
rt = (struct rt_msghdr *)p;
sa = (struct sockaddr *)(rt + 1);
for(i=0; i<RTAX_MAX; i++) {
if(rt->rtm_addrs & (1 << i)) {
sa_tab[i] = sa;
sa = (struct sockaddr *)((char *)sa + ROUNDUP(sa->sa_len));
} else {
sa_tab[i] = NULL;
}
}
if(((rt->rtm_addrs & (RTA_DST|RTA_GATEWAY)) == (RTA_DST|RTA_GATEWAY))
&& sa_tab[RTAX_DST]->sa_family == AF_INET
&& sa_tab[RTAX_GATEWAY]->sa_family == AF_INET) {
if(((struct sockaddr_in *)sa_tab[RTAX_DST])->sin_addr.s_addr == 0) {
char ifName[128];
if_indextoname(rt->rtm_index,ifName);
if(strcmp("en0",ifName)==0){
*addr = ((struct sockaddr_in *)(sa_tab[RTAX_GATEWAY]))->sin_addr.s_addr;
r = 0;
}
}
}
}
free(buf);
}
return r;
}
ですフレームワークを追加する必要はありますか?私はそれを動作させる方法を知らない。
おそらくかどうかを確認する必要があり、ユーザーが定義し、最終的に/、
getdefaultgateway
機能をインポートする前にこれを追加含ま方.hファイルで。 cファイルはXcodeによってコンパイルされています。ガベージコードを 'getdefaultgateway'関数に入れると、Xcodeはコンパイルをやめてそこにエラーを投げますか? –
うん、私はちょうどそれをチェックし、.cはコンパイルされる。多分、私のクラスで.mmの拡張子を持つ何かをしなければならないのでしょうか?私のクラスが自動鋳造を受け入れない時には、以前は問題がありました。 – theFool