X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fsocket.h;h=8d1ad70fff2d3603f6e2c5fee044578dd1cc25ff;hb=21079cc8ebae0bf694c1903c07bf3e1517feab99;hp=6b7a2462ee61ce2d696843978b99a9edf175968c;hpb=52d99fef31daa60903053bc565b6b9d3a31a2bc8;p=dragonfireclient.git diff --git a/src/socket.h b/src/socket.h index 6b7a2462e..8d1ad70ff 100644 --- a/src/socket.h +++ b/src/socket.h @@ -1,18 +1,18 @@ /* -Minetest-c55 -Copyright (C) 2010 celeron55, Perttu Ahola +Minetest +Copyright (C) 2013 celeron55, Perttu Ahola This program 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; either version 2 of the License, or +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This program 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. +GNU Lesser General Public License for more details. -You should have received a copy of the GNU General Public License along +You should have received a copy of the GNU Lesser General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ @@ -21,36 +21,31 @@ with this program; if not, write to the Free Software Foundation, Inc., #define SOCKET_HEADER #ifdef _WIN32 - #define WIN32_LEAN_AND_MEAN - // Without this some of the network functions are not found on mingw - #ifndef _WIN32_WINNT - #define _WIN32_WINNT 0x0501 + #ifndef WIN32_LEAN_AND_MEAN + #define WIN32_LEAN_AND_MEAN #endif +#ifndef _WIN32_WINNT + #define _WIN32_WINNT 0x0501 +#endif #include #include #include - #ifdef _MSC_VER - #pragma comment(lib, "ws2_32.lib") - #endif -typedef SOCKET socket_t; -typedef int socklen_t; #else #include #include - #include - #include - #include -typedef int socket_t; #endif #include +#include +#include "irrlichttypes.h" #include "exceptions.h" -#include "constants.h" + +extern bool socket_enable_debug_output; class SocketException : public BaseException { public: - SocketException(const char *s): + SocketException(const std::string &s): BaseException(s) { } @@ -59,7 +54,7 @@ class SocketException : public BaseException class ResolveError : public BaseException { public: - ResolveError(const char *s): + ResolveError(const std::string &s): BaseException(s) { } @@ -68,7 +63,7 @@ class ResolveError : public BaseException class SendFailedException : public BaseException { public: - SendFailedException(const char *s): + SendFailedException(const std::string &s): BaseException(s) { } @@ -77,36 +72,56 @@ class SendFailedException : public BaseException void sockets_init(); void sockets_cleanup(); +class IPv6AddressBytes +{ +public: + u8 bytes[16]; + IPv6AddressBytes() { memset(bytes, 0, 16); } +}; + class Address { public: Address(); - Address(unsigned int address, unsigned short port); - Address(unsigned int a, unsigned int b, - unsigned int c, unsigned int d, - unsigned short port); - bool operator==(Address &address); - bool operator!=(Address &address); + Address(u32 address, u16 port); + Address(u8 a, u8 b, u8 c, u8 d, u16 port); + Address(const IPv6AddressBytes *ipv6_bytes, u16 port); + bool operator==(const Address &address); + bool operator!=(const Address &address); + // Resolve() may throw ResolveError (address is unchanged in this case) void Resolve(const char *name); - unsigned int getAddress() const; + struct sockaddr_in getAddress() const; unsigned short getPort() const; - void setAddress(unsigned int address); - void setAddress(unsigned int a, unsigned int b, - unsigned int c, unsigned int d); + void setAddress(u32 address); + void setAddress(u8 a, u8 b, u8 c, u8 d); + void setAddress(const IPv6AddressBytes *ipv6_bytes); + struct sockaddr_in6 getAddress6() const; + int getFamily() const; + bool isIPv6() const; + bool isZero() const; void setPort(unsigned short port); void print(std::ostream *s) const; - void print() const; + std::string serializeString() const; private: - unsigned int m_address; - unsigned short m_port; + unsigned int m_addr_family; + union + { + struct sockaddr_in ipv4; + struct sockaddr_in6 ipv6; + } m_address; + u16 m_port; // Port is separate from sockaddr structures }; class UDPSocket { public: - UDPSocket(); + UDPSocket() { } + UDPSocket(bool ipv6); ~UDPSocket(); - void Bind(unsigned short port); + void Bind(Address addr); + + bool init(bool ipv6, bool noExceptions = false); + //void Close(); //bool IsOpen(); void Send(const Address & destination, const void * data, int size); @@ -119,6 +134,7 @@ class UDPSocket private: int m_handle; int m_timeout_ms; + int m_addr_family; }; #endif