src/Network/Address.hh
author Tero Marttila <terom@fixme.fi>
Tue, 27 Jan 2009 03:02:02 +0200
changeset 441 f769fab21a6c
parent 423 947ab54de4b7
permissions -rw-r--r--
fix bug with NetworkBufferOutput where push_write doesn't update offset
382
190f81d30624 rename files: Address -> Endpoint, SockAddr -> Address
terom
parents: 381
diff changeset
     1
#ifndef NETWORK_ADDRESS_H
190f81d30624 rename files: Address -> Endpoint, SockAddr -> Address
terom
parents: 381
diff changeset
     2
#define NETWORK_ADDRESS_H
381
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
     3
399
c7295b72731a documentation work on Network
Tero Marttila <terom@fixme.fi>
parents: 383
diff changeset
     4
/**
c7295b72731a documentation work on Network
Tero Marttila <terom@fixme.fi>
parents: 383
diff changeset
     5
 * @file
c7295b72731a documentation work on Network
Tero Marttila <terom@fixme.fi>
parents: 383
diff changeset
     6
 *
c7295b72731a documentation work on Network
Tero Marttila <terom@fixme.fi>
parents: 383
diff changeset
     7
 * Binary NetworkAddress
c7295b72731a documentation work on Network
Tero Marttila <terom@fixme.fi>
parents: 383
diff changeset
     8
 */
c7295b72731a documentation work on Network
Tero Marttila <terom@fixme.fi>
parents: 383
diff changeset
     9
c7295b72731a documentation work on Network
Tero Marttila <terom@fixme.fi>
parents: 383
diff changeset
    10
#include "Platform.hh"
382
190f81d30624 rename files: Address -> Endpoint, SockAddr -> Address
terom
parents: 381
diff changeset
    11
#include "Endpoint.hh"
381
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
    12
423
947ab54de4b7 fix worst compilation errors when using the debian lenny gcc/libc...
Tero Marttila <terom@fixme.fi>
parents: 400
diff changeset
    13
#include <cstring>
947ab54de4b7 fix worst compilation errors when using the debian lenny gcc/libc...
Tero Marttila <terom@fixme.fi>
parents: 400
diff changeset
    14
381
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
    15
/**
399
c7295b72731a documentation work on Network
Tero Marttila <terom@fixme.fi>
parents: 383
diff changeset
    16
 * A NetworkAddress represents a single network address in the form of a `struct sockaddr`, as used by the OS's socket
c7295b72731a documentation work on Network
Tero Marttila <terom@fixme.fi>
parents: 383
diff changeset
    17
 * API. A NetworkAddress's value may only be constructed/manipulated in sockaddr form, and the class then emulates the
c7295b72731a documentation work on Network
Tero Marttila <terom@fixme.fi>
parents: 383
diff changeset
    18
 * get_addrinfo (by building our own addrinfo struct value) and get_hostname()/get_service() (by using libc's
c7295b72731a documentation work on Network
Tero Marttila <terom@fixme.fi>
parents: 383
diff changeset
    19
 * getnameinfo() when the address is updated).
381
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
    20
 *
399
c7295b72731a documentation work on Network
Tero Marttila <terom@fixme.fi>
parents: 383
diff changeset
    21
 * This means that a NetworkAddress can be used like a NetworkEndpoint (like a literal IP address), but can also be
c7295b72731a documentation work on Network
Tero Marttila <terom@fixme.fi>
parents: 383
diff changeset
    22
 * used in a more specifc fashion like NetworkSocket::send or NetworkSocket::accept, where a definitive address is
c7295b72731a documentation work on Network
Tero Marttila <terom@fixme.fi>
parents: 383
diff changeset
    23
 * required.
c7295b72731a documentation work on Network
Tero Marttila <terom@fixme.fi>
parents: 383
diff changeset
    24
 *
400
d64bf28c4340 more documentation tweaking, all Network/ files now have a @file comment. Fix Platform.h -> Platform.hh, and Buffer.hh + Packet.cc
Tero Marttila <terom@fixme.fi>
parents: 399
diff changeset
    25
 * The update() method does a blocking reverse-DNS lookup. XXX: only do the reverse lookup if get_hostname is called?
d64bf28c4340 more documentation tweaking, all Network/ files now have a @file comment. Fix Platform.h -> Platform.hh, and Buffer.hh + Packet.cc
Tero Marttila <terom@fixme.fi>
parents: 399
diff changeset
    26
 *
399
c7295b72731a documentation work on Network
Tero Marttila <terom@fixme.fi>
parents: 383
diff changeset
    27
 * XXX: currently, there is no way to form a NetworkAddress from a NetworkEndpoint for e.g. sending UDP packets without
c7295b72731a documentation work on Network
Tero Marttila <terom@fixme.fi>
parents: 383
diff changeset
    28
 * an associated TCP connection.
381
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
    29
 */
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
    30
class NetworkAddress : public NetworkEndpoint {
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
    31
    protected:
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
    32
        /**
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
    33
         * The machine-readable address
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
    34
         */
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
    35
        sockaddr_storage address;
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
    36
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
    37
        /**
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
    38
         * The address length
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
    39
         */
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
    40
        socklen_t address_length;
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
    41
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
    42
    public:
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
    43
        /**
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
    44
         * Construct an empty SockAddr for later update()
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
    45
         */
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
    46
        NetworkAddress (void);
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
    47
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
    48
        /**
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
    49
         * Construct a NetworkAddress from a machine-readable address of the given length
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
    50
         */
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
    51
        NetworkAddress (const sockaddr *addr, socklen_t len);
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
    52
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
    53
        /**
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
    54
         * Get a const sockaddr* in this address
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
    55
         *
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
    56
         * @return read-only sockaddr pointer
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
    57
         */
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
    58
        const sockaddr* get_sockaddr (void) const { return (const sockaddr *) &address; }
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
    59
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
    60
        /**
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
    61
         * Get a mutable sockaddr* in this address
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
    62
         *
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
    63
         * @return writeable sockaddr pointer
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
    64
         */
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
    65
        sockaddr* get_sockaddr (void) { return (sockaddr *) &address; }
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
    66
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
    67
        /**
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
    68
         * Get the current address length
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
    69
         *
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
    70
         * @return address length
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
    71
         */
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
    72
        socklen_t get_socklen (void) const { return address_length; }
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
    73
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
    74
        /**
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
    75
         * Get a the address length pointer, initialized to the size of our sockaddr_storage.
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
    76
         *
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
    77
         * @return address length pointer
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
    78
         */
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
    79
        socklen_t* get_socklen_ptr (void) { address_length = sizeof(address); return &address_length; }
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
    80
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
    81
        /**
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
    82
         * Copy given sockaddr/len + update
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
    83
         */
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
    84
        void set_sockaddr (const sockaddr *addr, socklen_t len);
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
    85
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
    86
        /**
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
    87
         * Update internal state for NetworkAddress after sockaddr/socklen_ptr have been modified.
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
    88
         */
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
    89
        void update (void);
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
    90
        
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
    91
        /**
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
    92
         * Returns a "fake" addrinfo
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
    93
         */
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
    94
        virtual addrinfo* get_addrinfo (int family, int socktype, int protocol = 0, int flags = 0) const;
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
    95
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
    96
        /**
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
    97
         * Free an addrinfo returned by get_addrinfo
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
    98
         */
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
    99
        virtual void free_addrinfo (addrinfo *info) const;
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
   100
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
   101
        /**
383
2a57f0a871b0 note broken use of memcmp in NetworkAddress, and delete generated doc/final_document.pdf file
terom
parents: 382
diff changeset
   102
         * Equal-to comparison operator. Invalid addresses compare equal and are always smaller.
2a57f0a871b0 note broken use of memcmp in NetworkAddress, and delete generated doc/final_document.pdf file
terom
parents: 382
diff changeset
   103
         *
2a57f0a871b0 note broken use of memcmp in NetworkAddress, and delete generated doc/final_document.pdf file
terom
parents: 382
diff changeset
   104
         * XXX: use of memcmp is broken... there's garbage in the padding
381
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
   105
         */
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
   106
        bool operator== (const NetworkAddress &other) const {
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
   107
            return (address_length == other.address_length) && memcmp(&address, &other.address, address_length) == 0;
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
   108
        }
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
   109
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
   110
        /**
383
2a57f0a871b0 note broken use of memcmp in NetworkAddress, and delete generated doc/final_document.pdf file
terom
parents: 382
diff changeset
   111
         * Not-equal-to comparison operator. Invalid addresses compare equal and are always smaller.
381
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
   112
         */
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
   113
        bool operator!= (const NetworkAddress &other) const {
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
   114
            return (address_length != other.address_length) || memcmp(&address, &other.address, address_length) != 0;
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
   115
        }
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
   116
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
   117
        /**
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
   118
         * Less-than comparison operator. Smaller addresses are always lesser.
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
   119
         */
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
   120
        bool operator< (const NetworkAddress &other) const {
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
   121
            return (address_length < other.address_length) || memcmp(&address, &other.address, other.address_length) < 0;
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
   122
        }
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
   123
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
   124
        /**
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
   125
         * Greater-than comparison operator. Bigger addresses are always greater.
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
   126
         */
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
   127
        bool operator> (const NetworkAddress &other) const {
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
   128
            return (address_length > other.address_length) || memcmp(&address, &other.address, address_length) > 0;
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
   129
        }
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
   130
};
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
   131
9b35bc329d23 separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff changeset
   132
#endif