#if objc
#import <Foundation/Foundation.h>
//#import <CoreFoundation/CoreFoundation.h>
#import <sys/socket.h>
#import <netinet/in.h>
#import <arpa/inet.h>
#import <errno.h>
#import <string.h>
// Sources:
// https://stackoverflow.com/a/20374511
// http://alas.matf.bg.ac.rs/manuals/lspe/snode=48.html
// https://developer.apple.com/library/content/documentation/NetworkingInternet/Conceptual/NetworkingTopics/Articles/UsingSocketsandSocketStreams.html
// https://stackoverflow.com/questions/503878/how-to-know-what-the-errno-means
- (NSString *)getBoundSocketIPAddress: (int)socketnumber {
NSString *socketIP = @"0.0.0.0";
// Get hands on appropriate data structures via the socket number
CFSocketNativeHandle nativeSocketHandle = socketnumber;
uint8_t name[SOCK_MAXADDRLEN];
socklen_t namelen = sizeof(name);
// if (0 == getpeername(nativeSocketHandle, (struct sockaddr *)name, &namelen)) {
if (0 == getsockname(nativeSocketHandle, (struct sockaddr *)name, &namelen)) {
struct sockaddr *socketinfo = (struct sockaddr*)name;
if(AF_INET == socketinfo->sa_family) {
// If v4 is used
struct sockaddr_in *socketaddress = (struct sockaddr_in*)name;
// convert port to int
//int portnumber = socketaddress->sin_port
// convert ip to string
char ipstr[INET_ADDRSTRLEN];
struct in_addr *ipv4addr = &socketaddress->sin_addr;
if (inet_ntop(AF_INET, ipv4addr, ipstr, sizeof(ipstr)))
socketIP = [NSString stringWithFormat:@"%s", ipstr];
else
socketIP = [NSString stringWithFormat:@"ERROR: function inet_ntop(): %s", strerror(errno)];
} else if(AF_INET6 == socketinfo->sa_family) {
// if IPv6 is used
struct sockaddr_in6 *socketaddress = (struct sockaddr_in6*)name;
// convert port to int
//int portnumber = socketaddress->sin6_port;
// convert ip to string
char ipstr[INET6_ADDRSTRLEN];
struct in6_addr *ipv6addr = &socketaddress->sin6_addr;
if (inet_ntop(AF_INET6, ipv6addr, ipstr, sizeof(ipstr)))
socketIP = [NSString stringWithFormat:@"%s", ipstr];
else
socketIP = [NSString stringWithFormat:@"ERROR: function inet_ntop(): %s", strerror(errno)];
} else {
socketIP = [NSString stringWithFormat:@"ERROR: Unsupported Address Family: %d", &socketinfo->sa_family];
}
} else {
socketIP = [NSString stringWithFormat:@"ERROR: function getsockname(): %s", strerror(errno)];
}
return socketIP;
}
#End If