Files
@ r15277:0ede290e5561
Branch filter:
Location: cpp/openttd-patchpack/source/src/network/core/address.h - annotation
r15277:0ede290e5561
7.7 KiB
text/x-c
(svn r19922) -Fix[FS#3815]: Use of better english. "by" instead of "with" (planetmaker)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 | r10828:d8d68d002525 r10828:d8d68d002525 r12768:980ae0491352 r12768:980ae0491352 r12768:980ae0491352 r12768:980ae0491352 r12768:980ae0491352 r12768:980ae0491352 r12768:980ae0491352 r10828:d8d68d002525 r10828:d8d68d002525 r10828:d8d68d002525 r10828:d8d68d002525 r10828:d8d68d002525 r10828:d8d68d002525 r11590:2bff4ec7f0ca r11590:2bff4ec7f0ca r11592:12c71fbe8d50 r11591:dcfe7b4a6015 r13182:d311a9b54477 r13182:d311a9b54477 r11591:dcfe7b4a6015 r11591:dcfe7b4a6015 r11592:12c71fbe8d50 r10828:d8d68d002525 r10828:d8d68d002525 r10828:d8d68d002525 r10828:d8d68d002525 r10828:d8d68d002525 r10828:d8d68d002525 r10828:d8d68d002525 r10828:d8d68d002525 r11590:2bff4ec7f0ca r11649:7c14ee641f09 r11590:2bff4ec7f0ca r10828:d8d68d002525 r11553:665b4b3ba421 r11553:665b4b3ba421 r11553:665b4b3ba421 r11553:665b4b3ba421 r11553:665b4b3ba421 r11553:665b4b3ba421 r11553:665b4b3ba421 r11553:665b4b3ba421 r11553:665b4b3ba421 r11553:665b4b3ba421 r11553:665b4b3ba421 r11553:665b4b3ba421 r11592:12c71fbe8d50 r11553:665b4b3ba421 r11553:665b4b3ba421 r11553:665b4b3ba421 r11592:12c71fbe8d50 r10828:d8d68d002525 r10828:d8d68d002525 r10828:d8d68d002525 r11545:27d3f758c0c0 r11545:27d3f758c0c0 r11649:7c14ee641f09 r11551:57af1dbb6426 r11545:27d3f758c0c0 r10828:d8d68d002525 r11590:2bff4ec7f0ca r10828:d8d68d002525 r10828:d8d68d002525 r10828:d8d68d002525 r11555:622725a26a6d r11555:622725a26a6d r11555:622725a26a6d r11649:7c14ee641f09 r11555:622725a26a6d r11555:622725a26a6d r11590:2bff4ec7f0ca r11555:622725a26a6d r11555:622725a26a6d r11555:622725a26a6d r11555:622725a26a6d r11555:622725a26a6d r10828:d8d68d002525 r10828:d8d68d002525 r10828:d8d68d002525 r11567:a288e946756b r10828:d8d68d002525 r11615:3725a6566d9c r11551:57af1dbb6426 r10828:d8d68d002525 r11597:39dbd2f0af04 r11597:39dbd2f0af04 r11597:39dbd2f0af04 r11590:2bff4ec7f0ca r11599:60558ee2245d r11597:39dbd2f0af04 r11597:39dbd2f0af04 r11545:27d3f758c0c0 r11567:a288e946756b r11546:a4422f41f18b r10828:d8d68d002525 r10828:d8d68d002525 r10828:d8d68d002525 r10828:d8d68d002525 r10828:d8d68d002525 r10828:d8d68d002525 r11590:2bff4ec7f0ca r10828:d8d68d002525 r11590:2bff4ec7f0ca r10828:d8d68d002525 r10828:d8d68d002525 r10828:d8d68d002525 r10828:d8d68d002525 r10828:d8d68d002525 r10828:d8d68d002525 r10828:d8d68d002525 r11545:27d3f758c0c0 r10828:d8d68d002525 r10828:d8d68d002525 r11544:5b7269ee2600 r11609:9bf9c36c3172 r11609:9bf9c36c3172 r11609:9bf9c36c3172 r11609:9bf9c36c3172 r11609:9bf9c36c3172 r11609:9bf9c36c3172 r11609:9bf9c36c3172 r11609:9bf9c36c3172 r11602:593b9791e12a r11544:5b7269ee2600 r11609:9bf9c36c3172 r11544:5b7269ee2600 r11602:593b9791e12a r11545:27d3f758c0c0 r11545:27d3f758c0c0 r14992:2648a73e4ab8 r11545:27d3f758c0c0 r11545:27d3f758c0c0 r11545:27d3f758c0c0 r11544:5b7269ee2600 r11544:5b7269ee2600 r11551:57af1dbb6426 r11551:57af1dbb6426 r11551:57af1dbb6426 r11649:7c14ee641f09 r11551:57af1dbb6426 r11551:57af1dbb6426 r11551:57af1dbb6426 r11551:57af1dbb6426 r11551:57af1dbb6426 r11551:57af1dbb6426 r11551:57af1dbb6426 r10828:d8d68d002525 r10828:d8d68d002525 r10828:d8d68d002525 r11545:27d3f758c0c0 r10828:d8d68d002525 r10828:d8d68d002525 r11546:a4422f41f18b r11546:a4422f41f18b r11546:a4422f41f18b r11546:a4422f41f18b r11546:a4422f41f18b r11546:a4422f41f18b r10828:d8d68d002525 r10828:d8d68d002525 r10828:d8d68d002525 r10828:d8d68d002525 r10828:d8d68d002525 r11551:57af1dbb6426 r10828:d8d68d002525 r11546:a4422f41f18b r11546:a4422f41f18b r11597:39dbd2f0af04 r11597:39dbd2f0af04 r11597:39dbd2f0af04 r11597:39dbd2f0af04 r11597:39dbd2f0af04 r11597:39dbd2f0af04 r11597:39dbd2f0af04 r11572:9d570d041dd0 r11572:9d570d041dd0 r11572:9d570d041dd0 r11572:9d570d041dd0 r11572:9d570d041dd0 r11572:9d570d041dd0 r11572:9d570d041dd0 r11572:9d570d041dd0 r11546:a4422f41f18b r11546:a4422f41f18b r11574:e29f5f02e7d5 r11546:a4422f41f18b r11677:627f7f0cc1a2 r11546:a4422f41f18b r11574:e29f5f02e7d5 r11574:e29f5f02e7d5 r11579:997fbf83d583 r11574:e29f5f02e7d5 r11574:e29f5f02e7d5 r11546:a4422f41f18b r11547:d8613f4c59f9 r11550:baebd05afdd5 r11564:f44f0aa8c0c3 r11564:f44f0aa8c0c3 r11590:2bff4ec7f0ca r11564:f44f0aa8c0c3 r11677:627f7f0cc1a2 r11564:f44f0aa8c0c3 r11574:e29f5f02e7d5 r11574:e29f5f02e7d5 r11574:e29f5f02e7d5 r11574:e29f5f02e7d5 r11574:e29f5f02e7d5 r11574:e29f5f02e7d5 r11590:2bff4ec7f0ca r11590:2bff4ec7f0ca r11677:627f7f0cc1a2 r11590:2bff4ec7f0ca r11590:2bff4ec7f0ca r11590:2bff4ec7f0ca r11739:0fd5c23f2ad1 r11739:0fd5c23f2ad1 r11739:0fd5c23f2ad1 r11739:0fd5c23f2ad1 r11739:0fd5c23f2ad1 r11739:0fd5c23f2ad1 r11739:0fd5c23f2ad1 r11739:0fd5c23f2ad1 r11739:0fd5c23f2ad1 r11590:2bff4ec7f0ca r11590:2bff4ec7f0ca r11590:2bff4ec7f0ca r11590:2bff4ec7f0ca r11574:e29f5f02e7d5 r11677:627f7f0cc1a2 r11574:e29f5f02e7d5 r11574:e29f5f02e7d5 r11564:f44f0aa8c0c3 r11564:f44f0aa8c0c3 r11564:f44f0aa8c0c3 r11550:baebd05afdd5 r11550:baebd05afdd5 r11550:baebd05afdd5 r11550:baebd05afdd5 r11552:e4906bd09074 r11552:e4906bd09074 r11552:e4906bd09074 r11552:e4906bd09074 r11592:12c71fbe8d50 r11552:e4906bd09074 r11622:2661de6c808c r11843:07fb5d356fc9 r11843:07fb5d356fc9 r11843:07fb5d356fc9 r11843:07fb5d356fc9 r11843:07fb5d356fc9 r11843:07fb5d356fc9 r11843:07fb5d356fc9 r11843:07fb5d356fc9 r11843:07fb5d356fc9 r11843:07fb5d356fc9 r11843:07fb5d356fc9 r11843:07fb5d356fc9 r11843:07fb5d356fc9 r11843:07fb5d356fc9 r11843:07fb5d356fc9 r11843:07fb5d356fc9 r10828:d8d68d002525 r10828:d8d68d002525 r10828:d8d68d002525 r10828:d8d68d002525 | /* $Id$ */
/*
* This file is part of OpenTTD.
* OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
* OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
*/
/** @file core/address.h Wrapper for network addresses. */
#ifndef NETWORK_ADDRESS_H
#define NETWORK_ADDRESS_H
#include "os_abstraction.h"
#include "config.h"
#include "../../string_func.h"
#include "../../core/smallmap_type.hpp"
#ifdef ENABLE_NETWORK
class NetworkAddress;
typedef SmallVector<NetworkAddress, 4> NetworkAddressList;
typedef SmallMap<NetworkAddress, SOCKET, 4> SocketList;
/**
* Wrapper for (un)resolved network addresses; there's no reason to transform
* a numeric IP to a string and then back again to pass it to functions. It
* furthermore allows easier delaying of the hostname lookup.
*/
class NetworkAddress {
private:
char hostname[NETWORK_HOSTNAME_LENGTH]; ///< The hostname
int address_length; ///< The length of the resolved address
sockaddr_storage address; ///< The resolved address
/**
* Helper function to resolve something to a socket.
* @param runp information about the socket to try not
* @return the opened socket or INVALID_SOCKET
*/
typedef SOCKET (*LoopProc)(addrinfo *runp);
/**
* Resolve this address into a socket
* @param family the type of 'protocol' (IPv4, IPv6)
* @param socktype the type of socket (TCP, UDP, etc)
* @param flags the flags to send to getaddrinfo
* @param sockets the list of sockets to add the sockets to
* @param func the inner working while looping over the address info
* @return the resolved socket or INVALID_SOCKET.
*/
SOCKET Resolve(int family, int socktype, int flags, SocketList *sockets, LoopProc func);
public:
/**
* Create a network address based on a resolved IP and port
* @param address the IP address with port
*/
NetworkAddress(struct sockaddr_storage &address, int address_length) :
address_length(address_length),
address(address)
{
*this->hostname = '\0';
}
/**
* Create a network address based on a resolved IP and port
* @param address the IP address with port
*/
NetworkAddress(sockaddr *address, int address_length) :
address_length(address_length)
{
*this->hostname = '\0';
memset(&this->address, 0, sizeof(this->address));
memcpy(&this->address, address, address_length);
}
/**
* Create a network address based on a unresolved host and port
* @param ip the unresolved hostname
* @param port the port
* @param family the address family
*/
NetworkAddress(const char *hostname = "", uint16 port = 0, int family = AF_UNSPEC) :
address_length(0)
{
/* Also handle IPv6 bracket enclosed hostnames */
if (StrEmpty(hostname)) hostname = "";
if (*hostname == '[') hostname++;
strecpy(this->hostname, StrEmpty(hostname) ? "" : hostname, lastof(this->hostname));
char *tmp = strrchr(this->hostname, ']');
if (tmp != NULL) *tmp = '\0';
memset(&this->address, 0, sizeof(this->address));
this->address.ss_family = family;
this->SetPort(port);
}
/**
* Make a clone of another address
* @param address the address to clone
*/
NetworkAddress(const NetworkAddress &address)
{
memcpy(this, &address, sizeof(*this));
}
/**
* Get the hostname; in case it wasn't given the
* IPv4 dotted representation is given.
* @return the hostname
*/
const char *GetHostname();
/**
* Get the address as a string, e.g. 127.0.0.1:12345.
* @param buffer the buffer to write to
* @param last the last element in the buffer
* @param with_family whether to add the family (e.g. IPvX).
*/
void GetAddressAsString(char *buffer, const char *last, bool with_family = true);
/**
* Get the address as a string, e.g. 127.0.0.1:12345.
* @param with_family whether to add the family (e.g. IPvX).
* @return the address
* @note NOT thread safe
*/
const char *GetAddressAsString(bool with_family = true);
/**
* Get the address in its internal representation.
* @return the address
*/
const sockaddr_storage *GetAddress();
/**
* Get the (valid) length of the address.
* @return the length
*/
int GetAddressLength()
{
/* Resolve it if we didn't do it already */
if (!this->IsResolved()) this->GetAddress();
return this->address_length;
}
/**
* Get the port
* @return the port
*/
uint16 GetPort() const;
/**
* Set the port
* @param port set the port number
*/
void SetPort(uint16 port);
/**
* Check whether the IP address has been resolved already
* @return true iff the port has been resolved
*/
bool IsResolved() const
{
return this->address_length != 0;
}
/**
* Checks of this address is of the given family.
* @param family the family to check against
* @return true if it is of the given family
*/
bool IsFamily(int family);
/**
* Checks whether this IP address is contained by the given netmask.
* @param netmask the netmask in CIDR notation to test against.
* @note netmask without /n assumes all bits need to match.
* @return true if this IP is within the netmask.
*/
bool IsInNetmask(char *netmask);
/**
* Compare the address of this class with the address of another.
* @param address the other address.
* @return < 0 if address is less, 0 if equal and > 0 if address is more
*/
int CompareTo(NetworkAddress &address)
{
int r = this->GetAddressLength() - address.GetAddressLength();
if (r == 0) r = this->address.ss_family - address.address.ss_family;
if (r == 0) r = memcmp(&this->address, &address.address, this->address_length);
if (r == 0) r = this->GetPort() - address.GetPort();
return r;
}
/**
* Compare the address of this class with the address of another.
* @param address the other address.
* @return true if both match.
*/
bool operator == (NetworkAddress &address)
{
return this->CompareTo(address) == 0;
}
/**
* Compare the address of this class with the address of another.
* @param address the other address.
* @return true if both match.
*/
bool operator == (NetworkAddress &address) const
{
return const_cast<NetworkAddress*>(this)->CompareTo(address) == 0;
}
/**
* Compare the address of this class with the address of another.
* @param address the other address.
* @return true if both do not match.
*/
bool operator != (NetworkAddress address) const
{
return const_cast<NetworkAddress*>(this)->CompareTo(address) != 0;
}
/**
* Compare the address of this class with the address of another.
* @param address the other address.
*/
bool operator < (NetworkAddress &address)
{
return this->CompareTo(address) < 0;
}
/**
* Connect to the given address.
* @return the connected socket or INVALID_SOCKET.
*/
SOCKET Connect();
/**
* Make the given socket listen.
* @param socktype the type of socket (TCP, UDP, etc)
* @param sockets the list of sockets to add the sockets to
*/
void Listen(int socktype, SocketList *sockets);
/**
* Convert the socket type into a string
* @param socktype the socket type to convert
* @return the string representation
* @note only works for SOCK_STREAM and SOCK_DGRAM
*/
static const char *SocketTypeAsString(int socktype);
/**
* Convert the address family into a string
* @param family the family to convert
* @return the string representation
* @note only works for AF_INET, AF_INET6 and AF_UNSPEC
*/
static const char *AddressFamilyAsString(int family);
};
#endif /* ENABLE_NETWORK */
#endif /* NETWORK_ADDRESS_H */
|