Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 使用Cocoa获取所有可用网络接口(en0、en1、en2等)的列表?_Objective C_Cocoa_Networking - Fatal编程技术网

Objective c 使用Cocoa获取所有可用网络接口(en0、en1、en2等)的列表?

Objective c 使用Cocoa获取所有可用网络接口(en0、en1、en2等)的列表?,objective-c,cocoa,networking,Objective C,Cocoa,Networking,在我的Cocoa应用程序中,我希望向用户显示可用网络接口的列表,就像Wireshark所做的那样: 获得此类列表的最佳方式是什么?苹果是否提供了一个框架,或者我必须使用标准库或另一个库的C API吗? 您最快和最好的选择是为编写一个包装符iFCONFIG命令。 < P>优于包装IFCONFIG,您应该检查作为核心基础部分的SCNETWorkSt配置的引用。< /P> 有关详细信息,请查看SCNetworkInterfaceXxx功能。相关答案: #包括 SCDynamicStoreRef=SC

在我的Cocoa应用程序中,我希望向用户显示可用网络接口的列表,就像Wireshark所做的那样:


获得此类列表的最佳方式是什么?苹果是否提供了一个框架,或者我必须使用标准库或另一个库的C API吗?

您最快和最好的选择是为<代码>编写一个包装符iFCONFIG命令。

< P>优于包装IFCONFIG,您应该检查作为核心基础部分的SCNETWorkSt配置的引用。< /P> 有关详细信息,请查看SCNetworkInterfaceXxx功能。

相关答案:

#包括
SCDynamicStoreRef=SCDynamicStoreCreate(NULL,(CFStringRef)@“FindCurrentInterfaceIpMac”,NULL,NULL);
CFPropertyListRef global=SCDynamicStoreCopyValue(storeRef,CFSTR(“状态:/Network/Interface”);
id primaryInterface=[(uu桥NSDictionary*)全局值forkey:@“接口”];
for(主界面中的NSString*项)
{
NSLog(@“%@”,项目);
}

以下代码将通过系统配置从OS X获取所有接口,然后使用标准C函数获取IP地址(如果可用)

#包括
#包括
#包括
#包括
#包括
#包括
#包括
#定义IFT_以太0x6
#包括
+(void)获取接口
{
SCDynamicStoreRef=SCDynamicStoreCreate(NULL,(CFStringRef)@“FindCurrentInterfaceIpMac”,NULL,NULL);
CFPropertyListRef global=SCDynamicStoreCopyValue(storeRef,CFSTR(“状态:/Network/Interface”);
id primaryInterface=[(uu桥NSDictionary*)全局值forkey:@“接口”];
for(主界面中的NSString*项)
{
if(获取地址([item UTF8String]))
{
NSString*ip=[NSString stringWithUTF8String:获取地址([item UTF8String]);
NSLog(@“接口:%@-%@”,项目,ip);
}否则
NSLog(@“接口:%@”,项目);
}
}
静态字符*获取地址(字符*接口)
{
int袜子;
uint32_t ip;
结构ifreq-ifr;
char*val;
if(!接口)
返回NULL;
/*根据MAC地址确定UDN*/
sock=socket(AF\u INET,sock\u STREAM,0);
if(sock<0)
{
佩罗(“插座”);
返回NULL;
}
strcpy(ifr.ifr\u名称、接口);
ifr.ifr\u addr.sa\u family=AF\u INET;
如果(ioctl(sock、SIOCGIFADDR和ifr)<0)
{
perror(“ioctl”);
关闭(袜子);
返回NULL;
}
val=(char*)malloc(16*sizeof(char));
ip=((结构sockaddr_in*)和ifr.ifr_addr)->sin_addr.s_addr;
ip=ntohl(ip);
sprintf(val,“%d.%d.%d”,
(ip>>24)和0xFF,(ip>>16)和0xFF,(ip>>8)和0xFF,ip和0xFF);
关闭(袜子);
返回val;
}

潜在的安全问题和速度非常慢,而且
ifconfig
输出可能随时更改,您将被咬!
#include <SystemConfiguration/SCDynamicStore.h>

SCDynamicStoreRef storeRef = SCDynamicStoreCreate(NULL, (CFStringRef)@"FindCurrentInterfaceIpMac", NULL, NULL);
    CFPropertyListRef global = SCDynamicStoreCopyValue (storeRef,CFSTR("State:/Network/Interface"));
    id primaryInterface = [(__bridge NSDictionary *)global valueForKey:@"Interfaces"];

    for (NSString* item in primaryInterface)
    {
        NSLog(@"%@", item);
    }
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <sys/ioctl.h>
#include <net/if.h>
#define IFT_ETHER 0x6

#include <SystemConfiguration/SCDynamicStore.h>

+(void)getInterfaces
{
    SCDynamicStoreRef storeRef = SCDynamicStoreCreate(NULL, (CFStringRef)@"FindCurrentInterfaceIpMac", NULL, NULL);
    CFPropertyListRef global = SCDynamicStoreCopyValue (storeRef,CFSTR("State:/Network/Interface"));
    id primaryInterface = [(__bridge NSDictionary *)global valueForKey:@"Interfaces"];

    for (NSString* item in primaryInterface)
    {
        if(get_iface_address([item UTF8String]))
        {
            NSString *ip = [NSString stringWithUTF8String:get_iface_address([item UTF8String])];
            NSLog(@"interface: %@ - %@",item,ip);
        } else
            NSLog(@"interface: %@",item);
    }
}

static char * get_iface_address (char *interface)
{
    int sock;
    uint32_t ip;
    struct ifreq ifr;
    char *val;

    if (!interface)
        return NULL;

    /* determine UDN according to MAC address */
    sock = socket (AF_INET, SOCK_STREAM, 0);
    if (sock < 0)
    {
        perror ("socket");
        return NULL;
    }

    strcpy (ifr.ifr_name, interface);
    ifr.ifr_addr.sa_family = AF_INET;

    if (ioctl (sock, SIOCGIFADDR, &ifr) < 0)
    {
        perror ("ioctl");
        close (sock);
        return NULL;
    }

    val = (char *) malloc (16 * sizeof (char));
    ip = ((struct sockaddr_in *) &ifr.ifr_addr)->sin_addr.s_addr;
    ip = ntohl (ip);
    sprintf (val, "%d.%d.%d.%d",
             (ip >> 24) & 0xFF, (ip >> 16) & 0xFF, (ip >> 8) & 0xFF, ip & 0xFF);

    close (sock);

    return val;
}