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