IPAddress.h
author Jens Alfke <jens@mooseyard.com>
Thu May 29 16:40:36 2008 -0700 (2008-05-29)
changeset 8 6f539dd9921c
parent 0 9d67172bb323
child 26 cb9cdf247239
permissions -rw-r--r--
Got it to build on iPhone. (Haven't tried running it yet.)
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@2
    38
/** Returns the IP address of this host (with a port number of zero).
jens@0
    39
    If multiple network interfaces are active, the main one's address is returned. */
jens@0
    40
+ (IPAddress*) localAddress;
jens@0
    41
jens@0
    42
/** Returns the address of the peer that an open socket is connected to.
jens@0
    43
    (This calls getpeername.) */
jens@0
    44
+ (IPAddress*) addressOfSocket: (CFSocketNativeHandle)socket;
jens@0
    45
jens@0
    46
/** Returns YES if the two objects have the same IP address, ignoring port numbers. */
jens@0
    47
- (BOOL) isSameHost: (IPAddress*)addr;
jens@0
    48
jens@0
    49
/** The raw IPv4 address, in network (big-endian) byte order. */
jens@0
    50
@property (readonly) UInt32 ipv4;               // raw address in network byte order
jens@0
    51
jens@0
    52
/** The address as a dotted-quad string, e.g. @"10.0.1.1". */
jens@0
    53
@property (readonly) NSString* ipv4name;
jens@0
    54
jens@0
    55
/** The address as a DNS hostname or else a dotted-quad string.
jens@0
    56
    (IPAddress itself always returns dotted-quad; HostAddress returns the hostname it was
jens@0
    57
    initialized with.) */
jens@0
    58
@property (readonly) NSString* hostname;        // dotted-quad string, or DNS name if I am a HostAddress
jens@0
    59
jens@0
    60
/** The port number, or zero if none was specified, in native byte order. */
jens@0
    61
@property (readonly) UInt16 port;
jens@0
    62
jens@0
    63
/** Is this IP address in a designated private/local address range, such as 10.0.1.X?
jens@0
    64
    If so, the address is not globally meaningful outside of the local subnet. */
jens@0
    65
@property (readonly) BOOL isPrivate;            // In a private/local addr range like 10.0.1.X?
jens@0
    66
@end
jens@0
    67
jens@0
    68
jens@0
    69
jens@0
    70
/** A subclass of IPAddress that remembers the DNS hostname instead of a raw address.
jens@0
    71
    An instance of HostAddress looks up its ipv4 address on the fly by calling gethostbyname. */
jens@0
    72
@interface HostAddress : IPAddress
jens@0
    73
{
jens@0
    74
    NSString *_hostname;
jens@0
    75
}
jens@0
    76
jens@0
    77
- (id) initWithHostname: (NSString*)hostname port: (UInt16)port;
jens@0
    78
jens@0
    79
@end
jens@0
    80
jens@0
    81
jens@0
    82
jens@0
    83
/** An IPAddress that can keep track of statistics on when it was last sucessfully used
jens@0
    84
    and the number of successful attempts. This is useful when keeping a cache of recent
jens@0
    85
    addresses for a peer that doesn't have a stable address. */
jens@0
    86
@interface RecentAddress : IPAddress
jens@0
    87
{
jens@0
    88
    CFAbsoluteTime _lastSuccess;
jens@0
    89
    UInt32 _successes;
jens@0
    90
}
jens@0
    91
jens@0
    92
/** Initializes a RecentAddress from an IPAddress. (You can also initialize RecentAddress using
jens@0
    93
    any inherited initializer method.) */
jens@0
    94
- (id) initWithIPAddress: (IPAddress*)addr;
jens@0
    95
jens@0
    96
/** The absolute time that -noteSuccess or -noteSeen was last called. */
jens@0
    97
@property (readonly) CFAbsoluteTime lastSuccess;
jens@0
    98
jens@0
    99
/** The number of times that -noteSuccess has been called. */
jens@0
   100
@property (readonly) UInt32 successes;
jens@0
   101
jens@0
   102
/** Call this to indicate that the address was successfully used to connect to the desired peer.
jens@0
   103
    Returns YES if the state of the object has changed and it should be re-archived. */
jens@0
   104
- (BOOL) noteSuccess;
jens@0
   105
jens@0
   106
/** Call this to indicate that you have received evidence that this address is currently being
jens@0
   107
    used by this peer. Unlike -noteSuccess it doesn't increment -successes, and only returns
jens@0
   108
    YES (to indicate a persistent change) once every 18 hours (to avoid making the client
jens@0
   109
    save its cache too often.) */
jens@0
   110
- (BOOL) noteSeen;
jens@0
   111
jens@0
   112
@end