ucommon
7.0.0
About: GNU uCommon C++ is a portable and optimized class framework for writing C++ applications that need to use threads and support concurrent synchronization, and that use sockets, XML parsing, object serialization, thread-optimized string and data structure classes, etc.. Fossies Dox: ucommon-7.0.0.tar.gz ("inofficial" and yet experimental doxygen-generated source code documentation) 
|
Go to the documentation of this file. 27 #ifndef _UCOMMON_SOCKET_H_ 28 #define _UCOMMON_SOCKET_H_ 30 #ifndef _UCOMMON_TIMERS_H_ 34 #ifndef _UCOMMON_LINKED_H_ 38 #ifndef _UCOMMON_STRING_H_ 42 #ifndef _UCOMMON_TYPEREF_H_ 51 #define SHUT_RDWR SD_BOTH 52 #define SHUT_WR SD_SEND 53 #define SHUT_RD SD_RECV 54 typedef uint16_t in_port_t;
55 typedef uint32_t in_addr_t;
58 #include <sys/socket.h> 60 #include <netinet/in.h> 64 #if defined(__ANDROID__) 65 typedef uint16_t in_port_t;
71 #ifndef IPTOS_LOWDELAY 72 #define IPTOS_LOWDELAY 0x10 73 #define IPTOS_THROUGHPUT 0x08 74 #define IPTOS_RELIABILITY 0x04 75 #define IPTOS_MINCOST 0x02 79 #define DEFAULT_FAMILY AF_UNSPEC 81 #define DEFAULT_FAMILY AF_INET 102 #if defined(AF_INET6) || defined(__CYGWIN__) 114 struct sockaddr_in6 ipv6;
116 struct sockaddr_in
ipv4;
144 #define IPPROTO_DCCP 23 151 #define DCCP_SOCKOPT_AVAILABLE_CCIDS 12 152 #define DCCP_SOCKOPT_CCID 13 153 #define DCCP_SOCKOPT_TX_CCID 14 154 #define DCCP_SOCKOPT_RX_CCID 15 174 unsigned mask(
const char *cp)
const;
178 unsigned mask(
void)
const;
197 cidr(
const char *
string);
226 static const cidr *find(
const policy *
policy,
const struct sockaddr *address);
235 static const cidr *container(
const policy *
policy,
const struct sockaddr *address);
292 void set(
const char *
string);
299 bool is_member(
const struct sockaddr *address)
const;
306 inline bool operator==(
const struct sockaddr *address)
const {
307 return is_member(address);
315 inline bool operator!=(
const struct sockaddr *address)
const {
316 return !is_member(address);
347 static struct addrinfo *query(
const char *host,
const char *service,
int type = SOCK_STREAM,
int protocol = 0);
354 static void release(
struct addrinfo *list);
380 address(
int family,
const char *
address,
int type = SOCK_STREAM,
int protocol = 0);
394 address(
int family,
const char *hostname,
const char *service = NULL);
402 address(
const char *host,
const char *service,
int type = SOCK_STREAM);
464 bool operator==(
const address& other)
const;
467 return !(*
this==other);
471 return *
this == other;
478 const struct sockaddr *get(
void)
const;
480 struct sockaddr *modify(
void);
482 inline const struct sockaddr *
getAddr(
void)
const {
494 inline operator struct sockaddr *() {
503 const struct sockaddr *get(
int family)
const;
505 struct sockaddr *modify(
int family);
511 inline operator struct sockaddr_in *() {
512 return (
struct sockaddr_in *)modify(AF_INET);
516 inline operator struct sockaddr_in6 *() {
517 return (
struct sockaddr_in6 *)modify(AF_INET6);
525 int family(
void)
const;
540 return getPort(get());
547 void setPort(in_port_t
port);
559 struct sockaddr *find(
const struct sockaddr *
addr)
const;
597 size_t print(
char* dst,
size_t dst_sz,
bool port=
false,
bool force_brackets=
false)
const {
598 return print(get(), dst, dst_sz,
port, force_brackets);
605 inline operator bool()
const {
606 return list !=
nullptr;
610 return list !=
nullptr;
614 return list !=
nullptr;
622 return list ==
nullptr;
652 return isLoopback(get());
656 return isLoopback(get());
665 void setLoopback(
int family =
AF_UNSPEC);
678 void set(
const char *hostname,
const char *service = NULL,
int type = SOCK_STREAM);
686 void add(
const char *hostname,
const char *service = NULL,
int type = SOCK_STREAM);
695 void set(
int family,
const char *
address,
int type = SOCK_STREAM,
int protocol = 0);
722 bool remove(
const struct sockaddr *
address);
730 bool insert(
const struct sockaddr *
address);
743 void set(
struct sockaddr *
address);
750 void set(
const char *hostname, in_port_t service = 0);
773 static void setPort(
struct sockaddr *
address, in_port_t
port);
780 static bool isAny(
const struct sockaddr *
address);
786 static void setAny(
struct sockaddr *sa);
798 static bool isLoopback(
const struct sockaddr *
address);
805 static void setLoopback(
struct sockaddr *sa);
817 static struct sockaddr *
dup(
struct sockaddr *
address);
824 static struct sockaddr_in *ipv4(
struct sockaddr *
address);
832 static struct sockaddr_in6 *ipv6(
struct sockaddr *
address);
847 static size_t print(
const struct sockaddr *src,
char* dst,
size_t dst_sz,
bool port=
false,
bool ipv6_brackets=
false);
882 Socket(
int family,
int type,
int protocol = 0);
909 static void cancel(
socket_t socket);
919 inline int err(
void)
const {
928 bool is_pending(
unsigned value);
934 bool connected(
void)
const;
983 return broadcast(so, enable);
992 return keepalive(so, enable);
1001 return blocking(so, enable);
1010 return multicast(so, ttl);
1019 return loopback(so, enable);
1035 inline int ttl(uint8_t time) {
1036 return ttl(so, time);
1045 return sendsize(so, size);
1054 return sendwait(so, size);
1063 return recvsize(so, size);
1071 static int type(
const socket_t socket);
1079 static unsigned segsize(
socket_t socket,
unsigned size = 0);
1087 static bool ccid(
socket_t socket, uint8_t
id);
1103 return segsize(so, size);
1112 return ccid(so,
id);
1124 return tos(so, type);
1134 return priority(so, scheduling);
1141 ::shutdown(so, SHUT_RDWR);
1151 int connectto(
struct addrinfo *list);
1159 int disconnect(
void);
1166 int join(
const struct addrinfo *list,
const int ifindex = 0);
1173 int drop(
const struct addrinfo *list,
const int ifindex = 0);
1188 size_t peek(
void *data,
size_t number)
const;
1197 size_t readfrom(
void *data,
size_t number,
struct sockaddr_storage *address = NULL);
1206 size_t writeto(
const void *data,
size_t number,
const struct sockaddr *address = NULL);
1220 size_t readline(
char *data,
size_t size);
1227 size_t printf(
const char *format, ...)
__PRINTF(2,3);
1263 static ssize_t printf(
socket_t socket, const
char *format, ...)
__PRINTF(2,3);
1272 size_t writes(const
char *
string);
1278 operator
bool() const;
1284 bool operator!() const;
1315 static unsigned pending(
socket_t socket);
1323 static int sendsize(
socket_t socket,
unsigned size);
1331 static int sendwait(
socket_t socket,
unsigned size);
1339 static int recvsize(
socket_t socket,
unsigned size);
1356 static int disconnect(
socket_t socket);
1364 static int drop(
socket_t socket,
const struct addrinfo *list,
const int ifindex = 0);
1372 static int join(
socket_t socket,
const struct addrinfo *list,
const int ifindex = 0);
1387 static int multicast(
socket_t socket,
unsigned ttl = 1);
1395 static int loopback(
socket_t socket,
bool enable);
1403 static int blocking(
socket_t socket,
bool enable);
1411 static int keepalive(
socket_t socket,
bool enable);
1419 static int broadcast(
socket_t socket,
bool enable);
1426 static int nodelay(
socket_t socket);
1434 static int priority(
socket_t socket,
int scheduling);
1442 static int tos(
socket_t socket,
int type);
1450 static int ttl(
socket_t socket, uint8_t time);
1456 static int family(
socket_t socket);
1464 return ((
const struct sockaddr *)&
address)->sa_family;
1496 static ssize_t sendto(
socket_t socket,
const void *
buffer,
size_t size,
int flags = 0,
const struct sockaddr *address = NULL);
1508 return sendto(socket,
buffer, size, flags, (
const struct sockaddr *)
address);
1519 static int bindto(
socket_t socket,
const char *address,
const char *service,
int protocol = 0);
1528 static int listento(
socket_t socket,
const struct sockaddr *address,
int backlog = 5);
1536 static int bindto(
socket_t socket,
const struct sockaddr *address);
1553 static socket_t create(
int family,
int type,
int protocol);
1562 static socket_t create(
const struct addrinfo *address,
int type,
int protocol);
1573 static socket_t create(
const char *iface,
const char *service,
int family =
AF_UNSPEC,
int type = 0,
int protocol = 0);
1586 static void release(
socket_t socket);
1595 static char *hostname(
const struct sockaddr *address,
char *
buffer,
size_t size);
1616 static socklen_t query(
socket_t socket,
struct sockaddr_storage *address,
const char *hostname,
const char *service);
1623 static socklen_t len(
const struct sockaddr *address);
1632 static bool equal(
const struct sockaddr *address1,
const struct sockaddr *address2);
1640 static unsigned copy(
struct sockaddr *target,
const struct sockaddr *origin);
1648 static unsigned store(
struct sockaddr_storage *storage,
const struct sockaddr *address);
1656 static unsigned store(
struct sockaddr_internet *storage,
const struct sockaddr *address);
1665 static bool eq_host(
const struct sockaddr *address1,
const struct sockaddr *address2);
1675 return equal((
const struct sockaddr *)address1, (
const struct sockaddr *)address2);
1686 return equal((
const struct sockaddr *)address1, (
const struct sockaddr *)address2);
1696 static bool eq_subnet(
const struct sockaddr *address1,
const struct sockaddr *address2);
1706 static int via(
struct sockaddr *address,
const struct sockaddr *target, socklen_t size = 0);
1715 static char *query(
const struct sockaddr *address,
char *
buffer, socklen_t size);
1722 static in_port_t
port(
const struct sockaddr *address);
1739 static unsigned keyindex(
const struct sockaddr *address,
unsigned size);
1747 static unsigned keyhost(
const struct sockaddr *address,
unsigned size);
1752 static void init(
void);
1759 static void query(
int family);
1767 static void v4mapping(
bool enable);
1773 static int error(
void);
1783 static bool is_null(
const char *
string);
1792 static bool is_numeric(
const char *
string);
1847 static socket_t create(
const char *
address,
const char *service,
unsigned backlog = 5,
int family =
AF_UNSPEC,
int type = 0,
int protocol = 0);
1933 const struct sockaddr *_getaddrinfo(
const struct addrinfo *
addrinfo)
const;
1973 inline operator const struct sockaddr *()
const {
1974 return _getaddrinfo(
ptr);
1982 return _getaddrinfo(
ptr);
1985 inline operator const struct sockaddr_in *()
const {
1986 return (
struct sockaddr_in *)_getaddrinfo(
ptr);
1989 inline const struct sockaddr_in *
in(
void)
const {
1990 return (
struct sockaddr_in *)_getaddrinfo(
ptr);
1994 inline operator const struct sockaddr_in6 *()
const {
1995 return (
struct sockaddr_in6 *)_getaddrinfo(
ptr);
1998 inline const struct sockaddr_in6 *in6(
void)
const {
1999 return (
struct sockaddr_in6 *)_getaddrinfo(
ptr);
2007 return _getaddrsock(
ptr);
2014 inline operator bool()
const {
2015 return ptr !=
nullptr;
2058 return _getaddrinfo(
ptr);
2066 return ptr ==
nullptr;
2070 ptr = _nextaddrinfo(
ptr);
2090 return address.
get();
2100 inline bool eq(
const struct sockaddr *s1,
const struct sockaddr *s2) {
2112 return Socket::equal((
const struct sockaddr *)s1, (
const struct sockaddr *)s2);
2122 inline bool eq_host(
const struct sockaddr *s1,
const struct sockaddr *s2) {
2126 inline bool eq_subnet(
const struct sockaddr *s1,
const struct sockaddr *s2) {
2231 inline operator const struct sockaddr *()
const {
2232 return (
const struct sockaddr*)&
storage;
2236 return (
struct sockaddr *)&
storage;
2239 inline const struct sockaddr *
get()
const {
2240 return (
const struct sockaddr *)&
storage;
2292 inline operator const struct sockaddr *()
const {
2293 return (
const struct sockaddr*)&
storage;
2297 return (
struct sockaddr *)&
storage;
2300 inline const struct sockaddr *
get()
const {
2301 return (
const struct sockaddr *)&
storage;
bool operator!=(const struct hostaddr_internet *host) const
HostAddress(const HostAddress ©)
static in_port_t getPort(const struct sockaddr *address)
bool eq_host(const struct sockaddr *s1, const struct sockaddr *s2)
size_t getLength(void) const
const struct sockaddr * operator->() const
static bool eq_inet(const struct sockaddr_internet *address1, const struct sockaddr_internet *address2)
int sendwait(unsigned size)
static bool eq_subnet(const struct sockaddr *address1, const struct sockaddr *address2)
struct sockaddr * operator*()
static int family(const struct sockaddr_internet &address)
linked_pointer(Socket::address &list)
bool operator==(const struct sockaddr *check) const
SockAddress(const struct sockaddr *addr)
const char * getName(void) const
static in_port_t port(const struct sockaddr_internet *address)
bool operator==(const struct sockaddr *address) const
linked_pointer(const struct addrinfo *list)
static shell::stringopt error('e', "--error", _TEXT("stderr path to use"), "filename")
struct hostaddr_internet storage
int sendsize(unsigned size)
InetAddress & operator=(const struct sockaddr *addr)
socket_t handle(void) const
InetAddress(const struct sockaddr *addr)
int keepalive(bool enable)
bool operator==(const SockAddress &check) const
bool operator==(const SockAddress &check) const
struct sockaddr_internet storage
socket_t operator*() const
address(const sockaddr &address)
void set(const struct addrinfo *list)
static unsigned store(struct sockaddr_storage *storage, const struct sockaddr *address)
bool operator!=(const SockAddress &check) const
struct sockaddr * operator*()
HostAddress(const struct hostaddr_internet *addr)
bool operator==(const struct hostaddr_internet *host) const
linked_sockaddr_operations()
int blocking(bool enable)
bool operator!=(const struct sockaddr *check) const
static shell::numericopt port('p', "--port", _TEXT("port to use"), "port", 0)
in_port_t getPort(void) const
static bool eq_from(const struct sockaddr_storage *address1, const struct sockaddr_storage *address2)
unsigned pending(void) const
struct sockaddr_storage storage
address(const addrinfo *address)
bool operator==(const HostAddress &check) const
bool operator==(const struct sockaddr *check) const
int broadcast(bool enable)
int loopback(bool enable)
linked_pointer & operator=(const struct addrinfo *list)
size_t print(char *dst, size_t dst_sz, bool port=false, bool force_brackets=false) const
bool operator!=(const address &other) const
SockAddress & operator=(const struct sockaddr *addr)
bool eq(const struct sockaddr *s1, const struct sockaddr *s2)
InetAddress(const InetAddress ©)
HostAddress & operator=(const HostAddress ©)
struct hostaddr_internet * operator*()
HostAddress(const in_addr *addr)
struct sockaddr * sockaddr_t
const struct addrinfo * ptr
struct addrinfo * addrinfo(Socket::address &address)
static int family(const struct sockaddr_storage &address)
InetAddress & operator=(const InetAddress ©)
socket_t operator*() const
static ssize_t replyto(socket_t socket, const void *buffer, size_t size, int flags, const struct sockaddr_storage *address)
int getFamily(void) const
unsigned segsize(unsigned size)
SockAddress & operator=(const SockAddress ©)
bool operator!=(const HostAddress &check) const
bool operator!=(const struct sockaddr *check) const
address(int family, const char *address, int type=SOCK_STREAM, int protocol=0)
socket_t getsocket(void) const
void set(Socket::address &list)
String str(Socket &so, size_t size)
const struct sockaddr * getAddr(void) const
const struct sockaddr * get() const
unsigned getMask(void) const
static uint8_t buffer[65536]
const struct sockaddr * operator()(int family) const
HostAddress & operator=(const struct hostaddr_internet *host)
linked_pointer & operator=(Socket::address &list)
struct sockaddr sockaddr_struct
static shell::numericopt timeout('t', "--timeout", _TEXT("optional keyboard input timeout"), "seconds", 0)
struct addrinfo * getList(void) const
char sa_data[sizeof(struct sockaddr_in)]
int priority(int scheduling)
struct addrinfo * operator*() const
const struct sockaddr * operator*() const
int recvsize(unsigned size)
static bool equal(const struct sockaddr *address1, const struct sockaddr *address2)
static bool eq_host(const struct sockaddr *address1, const struct sockaddr *address2)
SockAddress(const SockAddress ©)
const struct sockaddr_in * in(void) const
linked_pointer(const linked_pointer ©)
static const timeout_t inf
bool wait(timeout_t timeout=0) const
bool operator!=(const struct sockaddr *address) const
int multicast(unsigned ttl=1)
bool equals(const address &other) const
bool eq_subnet(const struct sockaddr *s1, const struct sockaddr *s2)
socket_t operator()(void) const
const struct sockaddr * get() const
const struct sockaddr * get(void) const
bool operator!=(const SockAddress &check) const
const struct sockaddr * addr(Socket::address &address)
static size_t getLength(const struct sockaddr *address)
bool wait(timeout_t timeout=Timer::inf) const
static in_port_t port(const struct sockaddr *address)
const struct sockaddr * operator()(void) const