IPAddress.h
author Jens Alfke <jens@mooseyard.com>
Wed Apr 29 13:29:31 2009 -0700 (2009-04-29)
changeset 31 1d6924779df7
parent 26 cb9cdf247239
child 32 b3254a2f6d6c
permissions -rw-r--r--
More work on Bonjour classes. They now support registering services.
jens@0
     1
//
jens@0
     2
//  IPAddress.h
jens@0
     3
//  MYNetwork
jens@0
     4
//
jens@0
     5
//  Created by Jens Alfke on 1/4/08.
jens@0
     6
//  Copyright 2008 Jens Alfke. All rights reserved.
jens@0
     7
//
jens@0
     8
jens@0
     9
#import <Foundation/Foundation.h>
jens@0
    10
jens@0
    11
jens@2
    12
/** Represents an Internet Protocol address and port number (similar to a sockaddr_in).
jens@0
    13
    IPAddress itself only remembers the raw 32-bit IPv4 address; the subclass HostAddress
jens@0
    14
    also remembers the DNS host-name. */
jens@0
    15
@interface IPAddress : NSObject <NSCoding, NSCopying>
jens@0
    16
{
jens@0
    17
    UInt32 _ipv4;       // In network byte order (big-endian), just like struct in_addr
jens@0
    18
    UInt16 _port;       // native byte order
jens@0
    19
}
jens@0
    20
jens@0
    21
/** Initializes an IPAddress from a host name (which may be a DNS name or dotted-quad numeric form)
jens@0
    22
    and port number.
jens@0
    23
    If the hostname is not in dotted-quad form, an instance of the subclass HostAddress will
jens@0
    24
    be returned instead. */
jens@0
    25
- (id) initWithHostname: (NSString*)hostname port: (UInt16)port;
jens@0
    26
jens@0
    27
/** Initializes an IPAddress from a raw IPv4 address (in network byte order, i.e. big-endian)
jens@0
    28
    and port number (in native byte order) */
jens@0
    29
- (id) initWithIPv4: (UInt32)ipv4 port: (UInt16)port;
jens@0
    30
jens@0
    31
/** Initializes an IPAddress from a raw IPv4 address (in network byte order, i.e. big-endian).
jens@0
    32
    The port number defaults to zero. */
jens@0
    33
- (id) initWithIPv4: (UInt32)ipv4;
jens@0
    34
jens@0
    35
/** Initializes an IPAddress from a BSD struct sockaddr. */
jens@0
    36
- (id) initWithSockAddr: (const struct sockaddr*)sockaddr;
jens@0
    37
jens@26
    38
/** Returns the IP address of this host (plus the specified port number).
jens@26
    39
    If multiple network interfaces are active, the main one's address is returned. */
jens@26
    40
+ (IPAddress*) localAddressWithPort: (UInt16)port;
jens@26
    41
jens@2
    42
/** Returns the IP address of this host (with a port number of zero).
jens@0
    43
    If multiple network interfaces are active, the main one's address is returned. */
jens@0
    44
+ (IPAddress*) localAddress;
jens@0
    45
jens@0
    46
/** Returns the address of the peer that an open socket is connected to.
jens@0
    47
    (This calls getpeername.) */
jens@0
    48
+ (IPAddress*) addressOfSocket: (CFSocketNativeHandle)socket;
jens@0
    49
jens@0
    50
/** Returns YES if the two objects have the same IP address, ignoring port numbers. */
jens@0
    51
- (BOOL) isSameHost: (IPAddress*)addr;
jens@0
    52
jens@0
    53
/** The raw IPv4 address, in network (big-endian) byte order. */
jens@0
    54
@property (readonly) UInt32 ipv4;               // raw address in network byte order
jens@0
    55
jens@0
    56
/** The address as a dotted-quad string, e.g. @"10.0.1.1". */
jens@0
    57
@property (readonly) NSString* ipv4name;
jens@0
    58
jens@0
    59
/** The address as a DNS hostname or else a dotted-quad string.
jens@0
    60
    (IPAddress itself always returns dotted-quad; HostAddress returns the hostname it was
jens@0
    61
    initialized with.) */
jens@0
    62
@property (readonly) NSString* hostname;        // dotted-quad string, or DNS name if I am a HostAddress
jens@0
    63
jens@0
    64
/** The port number, or zero if none was specified, in native byte order. */
jens@0
    65
@property (readonly) UInt16 port;
jens@0
    66
jens@0
    67
/** Is this IP address in a designated private/local address range, such as 10.0.1.X?
jens@0
    68
    If so, the address is not globally meaningful outside of the local subnet. */
jens@0
    69
@property (readonly) BOOL isPrivate;            // In a private/local addr range like 10.0.1.X?
jens@0
    70
@end
jens@0
    71
jens@0
    72
jens@0
    73
jens@0
    74
/** A subclass of IPAddress that remembers the DNS hostname instead of a raw address.
jens@0
    75
    An instance of HostAddress looks up its ipv4 address on the fly by calling gethostbyname. */
jens@0
    76
@interface HostAddress : IPAddress
jens@0
    77
{
jens@0
    78
    NSString *_hostname;
jens@0
    79
}
jens@0
    80
jens@0
    81
- (id) initWithHostname: (NSString*)hostname port: (UInt16)port;
jens@0
    82
jens@28
    83
- (id) initWithHostname: (NSString*)hostname
jens@28
    84
               sockaddr: (const struct sockaddr*)sockaddr
jens@28
    85
                   port: (UInt16)port;
jens@28
    86
jens@0
    87
@end
jens@0
    88
jens@0
    89
jens@0
    90
jens@0
    91
/** An IPAddress that can keep track of statistics on when it was last sucessfully used
jens@0
    92
    and the number of successful attempts. This is useful when keeping a cache of recent
jens@0
    93
    addresses for a peer that doesn't have a stable address. */
jens@0
    94
@interface RecentAddress : IPAddress
jens@0
    95
{
jens@0
    96
    CFAbsoluteTime _lastSuccess;
jens@0
    97
    UInt32 _successes;
jens@0
    98
}
jens@0
    99
jens@0
   100
/** Initializes a RecentAddress from an IPAddress. (You can also initialize RecentAddress using
jens@0
   101
    any inherited initializer method.) */
jens@0
   102
- (id) initWithIPAddress: (IPAddress*)addr;
jens@0
   103
jens@0
   104
/** The absolute time that -noteSuccess or -noteSeen was last called. */
jens@0
   105
@property (readonly) CFAbsoluteTime lastSuccess;
jens@0
   106
jens@0
   107
/** The number of times that -noteSuccess has been called. */
jens@0
   108
@property (readonly) UInt32 successes;
jens@0
   109
jens@0
   110
/** Call this to indicate that the address was successfully used to connect to the desired peer.
jens@0
   111
    Returns YES if the state of the object has changed and it should be re-archived. */
jens@0
   112
- (BOOL) noteSuccess;
jens@0
   113
jens@0
   114
/** Call this to indicate that you have received evidence that this address is currently being
jens@0
   115
    used by this peer. Unlike -noteSuccess it doesn't increment -successes, and only returns
jens@0
   116
    YES (to indicate a persistent change) once every 18 hours (to avoid making the client
jens@0
   117
    save its cache too often.) */
jens@0
   118
- (BOOL) noteSeen;
jens@0
   119
jens@0
   120
@end