Objective-C를 사용하여 Mac의 모든 IP 주소 가져 오기

x74353

내 Mac의 모든 IP 주소 (IPv4 + IPv6)를 가져 오려고하는데 예상 한 결과가 표시되지 않습니다. 이 Stack Overflow 게시물의 코드를 사용하여 모든 IP 주소의 배열을 가져 오고 있지만 IP 주소가 누락되었습니다.

다른 Mac을 사용하여 인터넷 연결을 공유하고 IPv6 네트워크 테스트 / 지원을 위해 Apple의 설명서에 따라 NAT64 네트워크를 만듭니다 .

예를 들어 시스템 환경 설정 → 네트워크 패널에 내 IP 주소가 표시됩니다.

여기에 이미지 설명 입력

...하지만 추가 검사를 통해 실제로 두 개의 IPv6 주소가 있음을 알 수 있습니다.

여기에 이미지 설명 입력

...하지만 다음 중 하나만 반환됩니다.

"169.254.38.213",
"2001:2:0:aab1:d0ef:646d:f22a:5d83",
"127.0.0.1"

... 이것을 사용할 때 :

#include <ifaddrs.h>
#include <arpa/inet.h>
#include <net/if.h>

@interface AppDelegate ()

#define IP_ADDR_IPv4    @"ipv4"
#define IP_ADDR_IPv6    @"ipv6"

@end

@implementation AppDelegate

- (void) applicationDidFinishLaunching: (NSNotification *) aNotification
{
    NSMutableDictionary *addresses = [NSMutableDictionary dictionaryWithCapacity:8];
    NSMutableArray *ipAddressesArray = [[NSMutableArray alloc] init];

    // retrieve the current interfaces - returns 0 on success
    struct ifaddrs *interfaces;

    if (!getifaddrs(&interfaces))
    {
        // Loop through linked list of interfaces
        struct ifaddrs *interface;

        for (interface=interfaces; interface; interface=interface->ifa_next)
        {
            if (!(interface->ifa_flags & IFF_UP) /* || (interface->ifa_flags & IFF_LOOPBACK) */)
            {
                continue; // deeply nested code harder to read
            }

            const struct sockaddr_in *addr = (const struct sockaddr_in*)interface->ifa_addr;
            char addrBuf[ MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) ];

            if (addr && (addr->sin_family==AF_INET || addr->sin_family==AF_INET6))
            {
                NSString *name = [NSString stringWithUTF8String:interface->ifa_name];
                NSString *type;

                if (addr->sin_family == AF_INET)
                {
                    if (inet_ntop(AF_INET, &addr->sin_addr, addrBuf, INET_ADDRSTRLEN))
                    {
                        type = IP_ADDR_IPv4;
                    }
                }
                else
                {
                    const struct sockaddr_in6 *addr6 = (const struct sockaddr_in6*)interface->ifa_addr;

                    if (inet_ntop(AF_INET6, &addr6->sin6_addr, addrBuf, INET6_ADDRSTRLEN))
                    {
                        type = IP_ADDR_IPv6;
                    }
                }

                if (type)
                {
                    NSString *key = [NSString stringWithFormat:@"%@/%@", name, type];
                    addresses[key] = [NSString stringWithUTF8String:addrBuf];
                }
            }
        }

        for (id key in addresses)
        {
            if (![[addresses valueForKey:key] hasPrefix:@"fe80"])
            {
                [ipAddressesArray addObject:[addresses valueForKey:key]];
            }
        }

        // Free memory
        freeifaddrs(interfaces);
    }

    NSLog(@"%@", ipAddressesArray);
}

Any idea what is going on here? Does it matter? I'm trying to execute some other code conditionally based on IP address matching. It'd be one thing if the only IPv6 address returned was the one displayed to the user in System Preferences when first opening the Network pane, but instead the only IPv6 address returned is the "hidden" one that you have to dig into the Advanced... section to find. Thank you in advance.

x74353

The answer here is that I am an idiot. As suggested by Rob Napier in their comment on my question, I was essentially filtering out the missing IP addresses:

NSString *key = [NSString stringWithFormat:@"%@/%@", name, type];
addresses[key] = [NSString stringWithUTF8String:addrBuf];

각 인터페이스는 둘 이상의 IP 주소를 가질 수 있지만 인터페이스 유형을 addresses사전 의 고유 키로 사용했기 때문에 인터페이스 당 하나의 IP 주소 만 사전에 존재했습니다. 단일 사전이 아닌 사전 배열을 반환하여이 문제를 해결했습니다.

if (![[NSString stringWithFormat:@"%s", addrBuf] hasPrefix:@"fe80"])
{
      NSDictionary *addressDict = [NSDictionary dictionaryWithObjectsAndKeys :
                                                   [NSString stringWithFormat:@"%@/%@", name, type], @"Interface",
                                                   [NSString stringWithFormat:@"%s", addrBuf], @"Address",
                                                    nil];

     [addresses addObject:addressDict];
}

return addresses;

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

API를 사용하여 Android 기기의 IP 주소 가져 오기

분류에서Dev

C # 모든 로컬 IP 주소 가져 오기

분류에서Dev

jquery를 사용하여 선택한 모든 요소의 색인 가져 오기

분류에서Dev

rdflib를 사용하여 DB의 모든 관계 가져 오기

분류에서Dev

인스턴스를 만든 후 인스턴스의 IP 주소 가져 오기

분류에서Dev

Java를 사용하여 Hbase의 모든 행의 모든 값 가져 오기

분류에서Dev

주어진 두 주소 사이의 가능한 모든 IP를 가져옵니다

분류에서Dev

Azure PowerShell을 사용하여 VM의 MAC 주소를 가져 오는 방법

분류에서Dev

다른 Android 기기에서 핫스팟을 사용하여 Android 기기의 IP 주소 가져 오기

분류에서Dev

NDK를 사용하여 객체의 포인팅 메모리 주소 가져 오기

분류에서Dev

어레이 내의 여러 IP 주소를 객체로 가져 오기

분류에서Dev

AWS Fargate-Python boto3를 사용하여 작업의 퍼블릭 IP 주소를 가져 오는 방법

분류에서Dev

PyGitHub를 사용하여 특정 커밋에서 저장소의 모든 파일 콘텐츠 가져 오기

분류에서Dev

특정 범위 클래스를 사용하여 페이지의 모든 요소 가져 오기 Python Selenium

분류에서Dev

AngularJs를 사용하여 PagedList (Web API)에서 컬렉션의 모든 요소 수 가져 오기

분류에서Dev

프로세스에서 사용하는 소켓의 IP 주소 가져 오기

분류에서Dev

IP 주소를 사용하여 원격 서버의 호스트 이름을 가져 오는 명령

분류에서Dev

IP 주소를 사용하여 원격 서버의 호스트 이름을 가져 오는 명령

분류에서Dev

바인딩 된 모든 IP 주소 가져 오기

분류에서Dev

라우터의 공용 IP 주소를 가져 오는 명령

분류에서Dev

16 진수 메모리 주소를 사용하여 변수 값 가져 오기

분류에서Dev

rs.next ()를 사용하여 모든 배열 요소 가져 오기

분류에서Dev

호스트 IP를 반환하는 웹 사이트 클라이언트의 IP 주소 가져 오기

분류에서Dev

LINQ를 사용하여 XML의 주요 요소 특성 가져 오기

분류에서Dev

JAVA를 사용하여 주어진 XML 요소의 속성 가져 오기

분류에서Dev

JAVA를 사용하여 주어진 XML 요소의 속성 가져 오기

분류에서Dev

jquery를 사용하여 HTTPS 호스팅 웹 사이트에서 클라이언트의 IP 주소 가져 오기

분류에서Dev

Javascript를 사용하여 모든 확인란의 값 가져 오기

분류에서Dev

Linq를 사용하여 DataTable의 모든 DBNull 셀 목록 가져 오기

Related 관련 기사

  1. 1

    API를 사용하여 Android 기기의 IP 주소 가져 오기

  2. 2

    C # 모든 로컬 IP 주소 가져 오기

  3. 3

    jquery를 사용하여 선택한 모든 요소의 색인 가져 오기

  4. 4

    rdflib를 사용하여 DB의 모든 관계 가져 오기

  5. 5

    인스턴스를 만든 후 인스턴스의 IP 주소 가져 오기

  6. 6

    Java를 사용하여 Hbase의 모든 행의 모든 값 가져 오기

  7. 7

    주어진 두 주소 사이의 가능한 모든 IP를 가져옵니다

  8. 8

    Azure PowerShell을 사용하여 VM의 MAC 주소를 가져 오는 방법

  9. 9

    다른 Android 기기에서 핫스팟을 사용하여 Android 기기의 IP 주소 가져 오기

  10. 10

    NDK를 사용하여 객체의 포인팅 메모리 주소 가져 오기

  11. 11

    어레이 내의 여러 IP 주소를 객체로 가져 오기

  12. 12

    AWS Fargate-Python boto3를 사용하여 작업의 퍼블릭 IP 주소를 가져 오는 방법

  13. 13

    PyGitHub를 사용하여 특정 커밋에서 저장소의 모든 파일 콘텐츠 가져 오기

  14. 14

    특정 범위 클래스를 사용하여 페이지의 모든 요소 가져 오기 Python Selenium

  15. 15

    AngularJs를 사용하여 PagedList (Web API)에서 컬렉션의 모든 요소 수 가져 오기

  16. 16

    프로세스에서 사용하는 소켓의 IP 주소 가져 오기

  17. 17

    IP 주소를 사용하여 원격 서버의 호스트 이름을 가져 오는 명령

  18. 18

    IP 주소를 사용하여 원격 서버의 호스트 이름을 가져 오는 명령

  19. 19

    바인딩 된 모든 IP 주소 가져 오기

  20. 20

    라우터의 공용 IP 주소를 가져 오는 명령

  21. 21

    16 진수 메모리 주소를 사용하여 변수 값 가져 오기

  22. 22

    rs.next ()를 사용하여 모든 배열 요소 가져 오기

  23. 23

    호스트 IP를 반환하는 웹 사이트 클라이언트의 IP 주소 가져 오기

  24. 24

    LINQ를 사용하여 XML의 주요 요소 특성 가져 오기

  25. 25

    JAVA를 사용하여 주어진 XML 요소의 속성 가져 오기

  26. 26

    JAVA를 사용하여 주어진 XML 요소의 속성 가져 오기

  27. 27

    jquery를 사용하여 HTTPS 호스팅 웹 사이트에서 클라이언트의 IP 주소 가져 오기

  28. 28

    Javascript를 사용하여 모든 확인란의 값 가져 오기

  29. 29

    Linq를 사용하여 DataTable의 모든 DBNull 셀 목록 가져 오기

뜨겁다태그

보관