ping mit Swift

M

Mief

Mitglied
Thread Starter
Dabei seit
22.07.2012
Beiträge
70
Reaktionspunkte
1
Hallo, ich will eine App für den Mac schreiben und dieses muss die IP-Adresse eines anderen Computers rausfinden. Ich habe den Rechnernamen und die MAC-Adresse. Mit dem Rechnernamen kann ich ja den Computer über das Terminal anpingen und bekomme so dessen IP-Adresse.
Jetzt will ich das ganze in Swift machen.
Wisst ihr, wie man den Ping-Befehl in Swift nutzt, oder kennt jemand eine bessere Möglichkeit, die IP-Adresse herauszufinden?
 
Danke erstmal für die Links, aber irgendwie bin ich zu blöd dafür. Ich habe etwas umprobiert aber komme zu keinem Ergebnis, was nicht nach drei Zeilen einen Fehler ausgibt, mit dem ich nicht zurecht komme. Könntest du eventuell ein kleines Beispiel geben?
 
func CFHostCreateWithName(_ alloc: CFAllocator!,
_ hostname: CFString!) -> Unmanaged<CFHost>!

Dann

func CFHostStartInfoResolution(_ theHost: CFHost!,
_ info: CFHostInfoType,
_ error: UnsafeMutablePointer<CFStreamError>) -> Boolean

Dann

func CFHostGetAddressing(_ theHost: CFHost!,
_ hasBeenResolved: UnsafeMutablePointer<Boolean>) -> Unmanaged<CFArray>!

Ne Quatsch...nicht ganz...aber im Grunde ist das doch perfekt Step by Step oben erklärt?! Was brauchst du für ein Beispiel? Poste doch mal dein Code.
 
Bis zu der zweiten Methode bis zum zweiten Parameter bin ich auch schon vorher gekommen. Aber ab dem HostError hat das bei mir nicht mehr funktioniert.

Edit: Also woher bekomme ich den UnsafeMutablePointer<CFStreamError> ?
 
Zuletzt bearbeitet:
Ich habe es mal schnell getippselt…

Viele Grüße

Code:
-(void)applicationDidFinishLaunching:(NSNotification *)aNotification
{

    // …
    
    NSLog(@"ips: %@", [self hostAddressesFromName:@"www.macuser.de"]);
    
    // …

}

-(NSArray*)hostAddressesFromName:(NSString*)name
{
    
    // …
    
    if([name length] < 1)
    {
    
        return nil;
    
    }
    
    // …
    
    CFStringRef stringRef = (__bridge CFStringRef)name;
    
    // …
    
    CFHostRef hostRef = CFHostCreateWithName(kCFAllocatorDefault, stringRef);
    
    // …
    
    if(hostRef == NULL)
    {
    
        return nil;
    
    }
    
    // …

    Boolean done = CFHostStartInfoResolution(hostRef, kCFHostAddresses, NULL);
    
    if(done == FALSE)
    {
    
        return nil;
    
    }
    
    // …
    
    CFArrayRef arrayRef = CFHostGetAddressing(hostRef, &done);
    
    if(done == FALSE)
    {
        
        return nil;
        
    }
    
    // …
    
    NSMutableArray *mutableArray = [NSMutableArray array];
    
    if(mutableArray == nil)
    {
    
        return nil;
    
    }
    
    // …
    
    CFIndex count = CFArrayGetCount(arrayRef);
    
    // …
    
    for(CFIndex nIndex = 0; nIndex < count; nIndex++)
    {
        
        // …
        
        struct sockaddr *addr = (struct sockaddr*)CFDataGetBytePtr(CFArrayGetValueAtIndex(arrayRef, nIndex));
        
        if(addr == nil)
        {
        
            continue;
        
        }
        
        // …
        
        char address[INET6_ADDRSTRLEN];
        
        // …
        
        getnameinfo(addr,
                    addr->sa_len,
                    address,
                    INET6_ADDRSTRLEN,
                    nil,
                    0,
                    NI_NUMERICHOST);
        
        // …
        
        NSString *string = [NSString stringWithCString:address
                                              encoding:NSUTF8StringEncoding];
        
        if([string length] < 1)
        {
        
            continue;
        
        }
        
        // …
        
        if([mutableArray containsObject:string] == YES)
        {
        
            continue;
        
        }
        
        [mutableArray addObject:string];
        
        // …
        
    }
    
    // …
    
    CFRelease(hostRef);
    
    // …
    
    if([mutableArray count] < 1)
    {
    
        return nil;
    
    }
    
    // …
    
    return mutableArray;
    
    // …

}
 
Danke, das sieht schonmal gut aus. Wenn ich wieder zu Hause bin, werde ich das mal austesten.
 
Hach, ich hatte das ganz vergessen. Mir ist grad aufgefallen, dass dein Beispiel ja in Objective-C ist. Leider ist mein Swift nicht so gut, dass ich das komplett zu Swift portieren kann. Ich bin grad dabei, es zu versuchen, aber es wäre nett, wenn ihr mir dabei helfen könntet. :)

Edit: So, bin jetzt bis zur for-schleife gekommen, da bis nach die erste if-Abfrage. Dann haben meine Kenntnisse aufgehört. Bin halt noch recht neu in Swift und Objective-C. Hier mein bisheriger Code, aber bei dem CFHostStartInfoResolution gibt es bei dem zweiten und dritten Parameter einen "use of unresolved identifier" Fehler:

Code:
        let name = "xxxxx";
        let stringRef = (CFStringRef: name);
        
        var hostRef = CFHostCreateWithName(kCFAllocatorDefault, stringRef);
        
        var done = CFHostStartInfoResolution(hostRef, kCFHostAddresses, NULL); // Hier gibt es den Fehler
        
        var arrayRef = CFHostGetAddressing(hostRef, &done);
        
        var mutableArray = NSMutableArray();
        
        var count = CFArrayGetCount(arrayRef);
        
        for var nIndex = (CFIndex: 0); nIndex < count; nIndex++ {
            
            struct sockaddr addr = (struct sockaddr*)CFDataGetBytePtr(CFArrayGetValueAtIndex(arrayRef, nIndex));
            
            if(addr == nil)
            {
                continue;
            }
            
        }
 
Zurück
Oben Unten