zwopple / PocketSocket

Objective-C websocket library for building things that work in realtime on iOS and OS X.
Other
414 stars 129 forks source link

Get socket client ip #40

Closed sadanro100 closed 8 years ago

sadanro100 commented 8 years ago

How can I get address of the client connected in PSWebSocket?

I've tried

webSocket.copyStreamPropertyForKey(kCFStreamPropertySocketRemoteHostName as String)

but it returns nil.

Thank you

pierdr commented 8 years ago

@sadanro100 how did you solve it? How do you retrieve the ip address? Thanks.

guxuloop commented 1 year ago

@sadanro100 would you share your solution here ~ thank you very much

guxuloop commented 1 year ago

@sadanro100 @pierdr I got this solution, It's worked for me.

- (void)server:(PSWebSocketServer *)server webSocketDidOpen:(PSWebSocket *)webSocket {
    NSData *myData = (__bridge NSData *)[webSocket copyStreamPropertyForKey: @"kCFStreamPropertySocketNativeHandle"];

    CFSocketNativeHandle socketHandle = *(const CFSocketNativeHandle*)myData.bytes;

    uint8_t * buffer = malloc(myData.length);

    struct sockaddr_storage addr;
    socklen_t addr_len = sizeof(addr);

    getpeername(socketHandle, (struct sockaddr *)&addr, &addr_len);
    NSString * remoteAddr;
    if (addr.ss_family == AF_INET) {
        char addressString[INET_ADDRSTRLEN];
        inet_ntop(AF_INET, &((struct sockaddr_in *)&addr)->sin_addr, addressString, INET_ADDRSTRLEN);
        remoteAddr = [[NSString alloc] initWithUTF8String:addressString];
    } else if (addr.ss_family == AF_INET6) {
        char addressString[INET6_ADDRSTRLEN];
        inet_ntop(AF_INET6, &((struct sockaddr_in6 *)&addr)->sin6_addr, addressString, INET6_ADDRSTRLEN);
        remoteAddr = [[NSString alloc] initWithUTF8String:addressString];
    }
    free(buffer);

    // Now you have remoteAddr which will be a
    // string representation of a IPv4 or IPv6 address!
    NSLog(@"Remote Address: %@", remoteAddr);
    NSLog(@"Server websocket did open = %@  ref=%@", webSocket, [webSocket copyStreamPropertyForKey: @"kCFStreamPropertySocketNativeHandle"]);
}