/*
-Minetest-c55
-Copyright (C) 2010 celeron55, Perttu Ahola <celeron55@gmail.com>
+Minetest
+Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>
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.
*/
#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 <windows.h>
#include <winsock2.h>
#include <ws2tcpip.h>
- #ifdef _MSC_VER
- #pragma comment(lib, "ws2_32.lib")
- #endif
-typedef SOCKET socket_t;
-typedef int socklen_t;
#else
#include <sys/socket.h>
#include <netinet/in.h>
- #include <fcntl.h>
- #include <netdb.h>
- #include <unistd.h>
-typedef int socket_t;
#endif
#include <ostream>
+#include <string.h>
+#include "irrlichttypes.h"
#include "exceptions.h"
-#include "constants.h"
+
+extern bool socket_enable_debug_output;
class SocketException : 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);
+ 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==(Address &address);
bool operator!=(Address &address);
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;
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(bool ipv6);
~UDPSocket();
void Bind(unsigned short port);
//void Close();
private:
int m_handle;
int m_timeout_ms;
+ int m_addr_family;
};
#endif