简体   繁体   中英

Getting IPV4 address as a String

Im using Bonjour to browse for available services from specific devices. I can successfully obtain and resolve the services returned from the browse, however I would like to take the service and retrieve it's IPV4 address in String form. To do this I am using the arpa/inet library to translate the NSdata object received by the NSNetService.addresses into a String. The code below works most of the time however occasionally the line below results in the crashing of the app.

NSString *ipString = [NSString stringWithFormat: @"%s", inet_ntoa(socketAddress->sin_addr)];

The error: EXC_BAD_ACCESS

I am sure it has to do with the way I have declared this code, any ideas?

    + (NSString *)getStringFromAddressData:(NSData *)dataIn {
        struct sockaddr_in  *socketAddress = nil;

        socketAddress = (struct sockaddr_in *)[dataIn bytes];
        NSString *ipString = [NSString stringWithFormat: @"%s",      inet_ntoa(socketAddress->sin_addr)];

        return ipString;
    }

Stack trace:

    2015-08-13 08:23:45.860 Semiphores[4664:2119558] Stack trace : (
0   Semiphores                          0x0000000100001c0b +[BonjourAddressHelper getStringFromAddressData:] + 107
1   Semiphores                          0x0000000100007c8a _TFFC10Semiphores17BonjourController15resolveServicesFS0_FPSs9AnyObject_T_U_FT_T_ + 2682
2   Semiphores                          0x0000000100007207 _TTRXFo__dT__XFdCb__dT__ + 39
3   libdispatch.dylib                   0x00000001006852bb _dispatch_call_block_and_release + 12
4   libdispatch.dylib                   0x000000010067fd43 _dispatch_client_callout + 8
5   libdispatch.dylib                   0x0000000100683283 _dispatch_root_queue_drain + 1471
6   libdispatch.dylib                   0x0000000100694cd0 _dispatch_worker_thread3 + 106
7   libsystem_pthread.dylib             0x00007fff86770637 _pthread_wqthread + 729
8   libsystem_pthread.dylib             0x00007fff8676e40d start_wqthread + 13

)

What would happen if someone passed in nil data?

   + (NSString *)getStringFromAddressData:(NSData *)dataIn {
        if (dataIn != nil) {
            struct sockaddr_in  *socketAddress = nil;

            socketAddress = (struct sockaddr_in *)[dataIn bytes];
            NSString *ipString = [NSString stringWithFormat: @"%s",    inet_ntoa(socketAddress->sin_addr)];
            return ipString;
        }
        return @"";
    }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM