/* * Original work: Copyright (c) 2014, Oculus VR, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the * RakNet License.txt file in the licenses directory of this source tree. An additional grant * of patent rights can be found in the RakNet Patents.txt file in the same directory. * * * Modified work: Copyright (c) 2018, SLikeSoft UG (haftungsbeschränkt) * * This source code was modified by SLikeSoft. Modifications are licensed under the MIT-style * license found in the license.txt file in the root directory of this source tree. */ #ifndef __SOCK_ADDR_H #define __SOCK_ADDR_H #include "NativeTypes.h" namespace SLNet { // All pointers to socket address structures are often cast to pointers // to this type before use in various functions and system calls: struct sockaddr { unsigned short sa_family; // address family, AF_xxx char sa_data[14]; // 14 bytes of protocol address }; struct in_addr { unsigned long s_addr; // load with inet_pton() }; // IPv4 AF_INET sockets: struct sockaddr_in { short sin_family; // e.g. AF_INET, AF_INET6 unsigned short sin_port; // e.g. htons(3490) struct in_addr sin_addr; // see struct in_addr, below char sin_zero[8]; // zero this if you want to }; // IPv6 AF_INET6 sockets: struct in6_addr { unsigned char s6_addr[16]; // load with inet_pton() }; struct sockaddr_in6 { uint16_t sin6_family; // address family, AF_INET6 uint16_t sin6_port; // port number, Network Byte Order uint32_t sin6_flowinfo; // IPv6 flow information struct in6_addr sin6_addr; // IPv6 address uint32_t sin6_scope_id; // Scope ID }; // General socket address holding structure, big enough to hold either // struct sockaddr_in or struct sockaddr_in6 data: #define _SS_MAXSIZE 128 #define _SS_ALIGNSIZE (sizeof(int64_t)) typedef uint32_t sa_family_t; #define _SS_PAD1SIZE (_SS_ALIGNSIZE - sizeof(sa_family_t)) #define _SS_PAD2SIZE (_SS_MAXSIZE - (sizeof(sa_family_t)+ \ _SS_PAD1SIZE + _SS_ALIGNSIZE)) struct sockaddr_storage { sa_family_t ss_family; char _ss_pad1[_SS_PAD1SIZE]; int64_t _ss_align; char _ss_pad2[_SS_PAD2SIZE]; }; #define INADDR_ANY (unsigned long)0x00000000 #define INADDR_LOOPBACK 0x7f000001 #define INADDR_BROADCAST (unsigned long)0xffffffff #define INADDR_NONE 0xffffffff /* Supported address families. */ #define AF_UNSPEC 0 #define AF_UNIX 1 /* Unix domain sockets */ #define AF_INET 2 /* Internet IP Protocol */ #define AF_AX25 3 /* Amateur Radio AX.25 */ #define AF_IPX 4 /* Novell IPX */ #define AF_APPLETALK 5 /* Appletalk DDP */ #define AF_NETROM 6 /* Amateur radio NetROM */ #define AF_BRIDGE 7 /* Multiprotocol bridge */ #define AF_AAL5 8 /* Reserved for Werner's ATM */ #define AF_X25 9 /* Reserved for X.25 project */ #define AF_INET6 10 /* IP version 6 */ #define AF_MAX 12 /* For now.. */ #ifndef IPPROTO_IP #define IPPROTO_IP 0 /* dummy for IP */ #endif #ifndef IPPROTO_HOPOPTS #define IPPROTO_HOPOPTS 0 /* IPv6 hop-by-hop options */ #endif #ifndef IPPROTO_ICMP #define IPPROTO_ICMP 1 /* control message protocol */ #endif #ifndef IPPROTO_IGMP #define IPPROTO_IGMP 2 /* group mgmt protocol */ #endif #ifndef IPPROTO_IPV4 #define IPPROTO_IPV4 4 #endif #ifndef IPPROTO_TCP #define IPPROTO_TCP 6 /* tcp */ #endif #ifndef IPPROTO_EGP #define IPPROTO_EGP 8 /* exterior gateway protocol */ #endif #ifndef IPPROTO_PIGP #define IPPROTO_PIGP 9 #endif #ifndef IPPROTO_UDP #define IPPROTO_UDP 17 /* user datagram protocol */ #endif #ifndef IPPROTO_DCCP #define IPPROTO_DCCP 33 /* datagram congestion control protocol */ #endif #ifndef IPPROTO_IPV6 #define IPPROTO_IPV6 41 #endif #ifndef IPPROTO_ROUTING #define IPPROTO_ROUTING 43 /* IPv6 routing header */ #endif #ifndef IPPROTO_FRAGMENT #define IPPROTO_FRAGMENT 44 /* IPv6 fragmentation header */ #endif #ifndef IPPROTO_RSVP #define IPPROTO_RSVP 46 /* resource reservation */ #endif #ifndef IPPROTO_GRE #define IPPROTO_GRE 47 /* General Routing Encap. */ #endif #ifndef IPPROTO_ESP #define IPPROTO_ESP 50 /* SIPP Encap Sec. Payload */ #endif #ifndef IPPROTO_AH #define IPPROTO_AH 51 /* SIPP Auth Header */ #endif #ifndef IPPROTO_MOBILE #define IPPROTO_MOBILE 55 #endif #ifndef IPPROTO_ICMPV6 #define IPPROTO_ICMPV6 58 /* ICMPv6 */ #endif #ifndef IPPROTO_NONE #define IPPROTO_NONE 59 /* IPv6 no next header */ #endif #ifndef IPPROTO_DSTOPTS #define IPPROTO_DSTOPTS 60 /* IPv6 destination options */ #endif /*Standard socket types */ #define SOCK_STREAM 1 /*virtual circuit*/ #define SOCK_DGRAM 2 /*datagram*/ #define SOCK_RAW 3 /*raw socket*/ #define SOCK_RDM 4 /*reliably-delivered message*/ #define SOCK_CONN_DGRAM 5 /*connection datagram*/ inline uint16_t ntohs(uint16_t s) {return (((s>> 8)) | (s << 8));}; inline uint16_t htons(uint16_t s) {return (((s>> 8)) | (s << 8));}; inline uint32_t ntohl(uint32_t s) {return (((s&0x000000FF)<<24)+((s&0x0000FF00)<<8)+((s&0x00FF0000)>>8)+((s&0xFF000000)>>24)); }; inline uint32_t htonl(uint32_t s) {return (((s&0x000000FF)<<24)+((s&0x0000FF00)<<8)+((s&0x00FF0000)>>8)+((s&0xFF000000)>>24)); }; /* * Level number for (get/set)sockopt() to apply to socket itself. */ #define SOL_SOCKET 0xffff /* options for socket level */ /* * Additional options, not kept in so_options. */ #define SO_SNDBUF 0x1001 /* send buffer size */ #define SO_RCVBUF 0x1002 /* receive buffer size */ #define SO_SNDLOWAT 0x1003 /* send low-water mark */ #define SO_RCVLOWAT 0x1004 /* receive low-water mark */ #define SO_SNDTIMEO 0x1005 /* send timeout */ #define SO_RCVTIMEO 0x1006 /* receive timeout */ #define SO_ERROR 0x1007 /* get error status and clear */ #define SO_TYPE 0x1008 /* get socket type */ /* * Option flags per-socket. */ #define SO_DEBUG 0x0001 /* turn on debugging info recording */ #define SO_ACCEPTCONN 0x0002 /* socket has had listen() */ #define SO_REUSEADDR 0x0004 /* allow local address reuse */ #define SO_KEEPALIVE 0x0008 /* keep connections alive */ #define SO_DONTROUTE 0x0010 /* just use interface addresses */ #define SO_BROADCAST 0x0020 /* permit sending of broadcast msgs */ #define SO_USELOOPBACK 0x0040 /* bypass hardware when possible */ #define SO_LINGER 0x0080 /* linger on close if data present */ #define SO_OOBINLINE 0x0100 /* leave received OOB data in line */ #define IP_TOS 1 #define IP_TTL 2 #define IP_HDRINCL 3 #define IP_OPTIONS 4 #define IP_ROUTER_ALERT 5 #define IP_RECVOPTS 6 #define IP_RETOPTS 7 #define IP_PKTINFO 8 #define IP_PKTOPTIONS 9 #define IP_MTU_DISCOVER 10 #define IP_RECVERR 11 #define IP_RECVTTL 12 #define IP_RECVTOS 13 #define IP_MTU 14 #define IP_FREEBIND 15 #ifndef AI_PASSIVE # define AI_PASSIVE 1 #endif /* AI_PASSIVE */ #define SD_RECEIVE 0 #define SD_SEND 1 #define SD_BOTH 2 struct addrinfo { int ai_flags; int ai_family; int ai_socktype; int ai_protocol; size_t ai_addrlen; struct sockaddr *ai_addr; char *ai_canonname; struct addrinfo *ai_next; }; inline char *inet_ntoa(in_addr in) { static char staticBuff[32]; char workingbuff[8]; int part1 = ((in.s_addr & 0xFF000000) >> 24); int part2 = ((in.s_addr & 0x00FF0000) >> 16); int part3 = ((in.s_addr & 0x0000FF00) >> 8); int part4 = ((in.s_addr & 0x000000FF) >> 0); _itoa(part1,staticBuff,10); strcat(staticBuff,"."); _itoa(part2,workingbuff,10); strcat(staticBuff,workingbuff); strcat(staticBuff,"."); _itoa(part3,workingbuff,10); strcat(staticBuff,workingbuff); strcat(staticBuff,"."); _itoa(part4,workingbuff,10); strcat(staticBuff,workingbuff); return (char*) staticBuff; } }; #endif