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
|