DSL
sockets3.h
1 //@AUTOHEADER@BEGIN@
2 /***********************************************************************\
3 | Drift Standard Libraries v1.01 |
4 | Copyright 2010-2023 Drift Solutions / Indy Sams |
5 | Docs and more information available at https://www.driftsolutions.dev |
6 | This file released under the 3-clause BSD license, |
7 | see included DSL.LICENSE.TXT file for details. |
8 \***********************************************************************/
9 //@AUTOHEADER@END@
10 
11 #ifndef __DSL_SOCKETS3_H__
12 #define __DSL_SOCKETS3_H__
13 
14 #include <drift/Mutex.h>
15 #include <set>
16 
26 #define MAX_SOCKETS 1024
27 #define ADDRLEN 128
28 #define DS3_MAX_HOSTLEN 40
29 #define DS3_MAX_SERVLEN 8
30 
31 class DSL_API_CLASS DSL_SOCKET {
32  friend class DSL_Sockets3_Base;
33 private:
34  int last_errno = 0;
35  char last_error[128] = { 0 };
36 public:
37  SOCKET sock = 0;
38  uint8 flags = 0;
39 
40  char remote_ip[DS3_MAX_HOSTLEN] = { 0 };
41  char local_ip[DS3_MAX_HOSTLEN] = { 0 };
42  int remote_port = 0;
43  int local_port = 0;
44  int family = 0;
45  int type = 0;
46  int proto = 0;;
47  bool nonblocking = false;
48 
50  void * userPtr = NULL;
51 };
52 typedef DSL_SOCKET D_SOCKET;
53 
54 class DSL_API_CLASS DSL_SOCKET_LIST {
55 #ifndef DOXYGEN_SKIP
56 public:
57  set<D_SOCKET *> socks;
58 #endif
59 };
60 
61 DSL_API void DSL_CC DFD_ZERO(DSL_SOCKET_LIST * x);
62 DSL_API void DSL_CC DFD_SET(DSL_SOCKET_LIST * x, DSL_SOCKET * sock);
63 DSL_API bool DSL_CC DFD_ISSET(DSL_SOCKET_LIST * list, DSL_SOCKET * sock);
64 DSL_API void DSL_CC DFD_CLR(DSL_SOCKET_LIST * x, DSL_SOCKET * sock);
65 DSL_API void DSL_CC DFD_COPY(DSL_SOCKET_LIST * const in, DSL_SOCKET_LIST * out);
66 
69 
70  DS3_SSL_METHOD_TLS1_2 = 1,
71  DS3_SSL_METHOD_TLS1_1 = 2,
73 
74 #if !defined(NO_DTLS1)
76 #endif
77  DS3_SSL_METHOD_DEFAULT = DS3_SSL_METHOD_TLS,
78 };
79 
80 class DSL_API_CLASS DSL_Sockets3_Base {
81 #ifndef DOXYGEN_SKIP
82  friend class DSL_Sockets_Events;
83 
84  protected:
85  DSL_Mutex_Base * hMutex = NULL;
86 
87  char bError[512];
88  int bErrNo;
89  bool silent;
90  void pUpdateError(DSL_SOCKET * sock);
91  void pUpdateError(DSL_SOCKET * sock, int serrno, const char * errstr);
92 
93  unsigned int avail_flags = 0;
94  unsigned int enabled_flags = 0;
95 
96  virtual DSL_SOCKET * pAllocSocket();
97  virtual int pRecv(DSL_SOCKET * sock, char * buf, uint32 bufsize);
98  virtual int pPeek(DSL_SOCKET * sock, char * buf, uint32 bufsize);
99  virtual int pSend(DSL_SOCKET * sock, const char * buf, uint32 bufsize);
100  virtual int pSelect_Read(DSL_SOCKET * sock, timeval * timeo);
101 
102  private:
103  bool free_mutex = false;
104  typedef std::set<DSL_SOCKET *> knownSocketList;
105  knownSocketList sockets;
106  bool pUpdateAddrInfo(DSL_SOCKET * sock);
107  addrinfo * pResolve(DSL_SOCKET * sock, const char * host, int port);
108  void pFreeAddrInfo(addrinfo * ai);
109 #endif
110 
111  public:
112  DSL_Sockets3_Base(DSL_Mutex_Base * mutex = NULL);
113  virtual ~DSL_Sockets3_Base();
114 
115  virtual bool IsSupported(unsigned int flag);
116  virtual bool IsEnabled(unsigned int flag);
117  virtual void Silent(bool bSilent);
118 
119  virtual int GetLastError(D_SOCKET * sock=NULL);
120  virtual const char * GetLastErrorString(D_SOCKET * sock=NULL);
121 
122  /*
123  * Create a socket.
124  * @param family Should be PF_INET for IPv4, PF_INET6 for IPv6, or AF_UNIX for Unix sockets.
125  * @param flags A combination of zero or more DS3_FLAG_* flags.
126  * @return a DSL_SOCKET pointer on success or NULL on error.
127  * @sa DS3_FLAG_SSL
128  * @sa DS3_FLAG_ZIP
129  */
130  virtual DSL_SOCKET * Create(int family = PF_INET, int type = SOCK_STREAM, int proto = IPPROTO_TCP, uint32 flags=0);
131  virtual int Close(DSL_SOCKET * sock);
132  virtual bool IsKnownSocket(DSL_SOCKET * sock);
133 
134  virtual int GetFamilyHint(const char * host, int port);
135  virtual bool Connect(DSL_SOCKET * sock, const char * host, int port);
136  virtual bool Connect(DSL_SOCKET * sock, sockaddr * addr, size_t addrlen);
137  virtual bool ConnectWithTimeout(DSL_SOCKET * sock, const char * host, int port, uint32 timeout);
138 
139  /*
140  * Sends data over a socket
141  * @param doloop If true Send() will loop until all the data is sent or an error occurs.
142  * @return Same as send()
143  */
144  virtual int Send(DSL_SOCKET * sock, const char * data, int datalen = -1, bool doloop = true);
145  /*
146  * Receives data from a socket
147  * @return Same as recv()
148  */
149  virtual int Recv(DSL_SOCKET * sock, char * buf, uint32 bufsize);
150  /*
151  * Receives a single line from a socket terminated in \n
152  * @return >=0 = line is stored in buf of the returned value in length. RL3_ERROR = socket error, RL3_CLOSED = peer closed connection, RL3_LINETOOLONG = data received is >= bufsize but has no \n in it, RL3_NOLINE = no newline in received data.
153  */
154  virtual int RecvLine(DSL_SOCKET * sock, char * buf, int bufsize);
155  /*
156  * Peeks at received data in a socket without removing it.
157  * @return Same as recv() with MSG_PEEK specified.
158  */
159  virtual int Peek(DSL_SOCKET * sock, char * buf, uint32 bufsize);
160 
161  virtual int Select_Read(DSL_SOCKET * sock, timeval * timeo);
162  virtual int Select_Read(DSL_SOCKET * sock, uint32 millisec);
163  virtual int Select_Write(DSL_SOCKET * sock, timeval * timeo);
164  virtual int Select_Write(DSL_SOCKET * sock, uint32 millisec);
165 
166  virtual int Select_Read_List(DSL_SOCKET_LIST * list, timeval * timeo);
167  virtual int Select_Read_List(DSL_SOCKET_LIST * list, uint32 millisec);
168  virtual int Select_List(DSL_SOCKET_LIST * list_r, DSL_SOCKET_LIST * list_w, timeval * timeo);
169  virtual int Select_List(DSL_SOCKET_LIST * list_r, DSL_SOCKET_LIST * list_w, uint32 millisec);
170 
171  virtual DSL_SOCKET * Accept(DSL_SOCKET * s, sockaddr *addr, socklen_t *addrlen, uint32 flags=0);
172  virtual DSL_SOCKET * Accept(DSL_SOCKET * s, uint32 flags=0);
173  virtual bool Bind(DSL_SOCKET * sock, int port);
174  virtual bool BindToAddr(DSL_SOCKET * sock, const char * host, int port);
175  virtual bool Listen(DSL_SOCKET * s, int backlog=5);
176 
177  virtual int SendTo(DSL_SOCKET * sock, const char * host, int port, const char * buf, int datalen = -1);
178  virtual int RecvFrom(DSL_SOCKET * sock, char * host, uint32 hostSize, int * port, char * buf, uint32 bufsize);
179  virtual int RecvLineFrom(DSL_SOCKET * sock, char * host, uint32 hostSize, int * port, char * buf, uint32 bufsize);
180  virtual int PeekFrom(DSL_SOCKET * sock, char * host, uint32 hostSize, int * port, char * buf, uint32 bufsize);
181 
182  virtual int SetRecvTimeout(DSL_SOCKET * sock, uint32 millisec);
183  virtual int SetSendTimeout(DSL_SOCKET * sock, uint32 millisec);
184 
185  virtual bool IsNonBlocking(DSL_SOCKET * sock);
186  virtual void SetNonBlocking(DSL_SOCKET * sock, bool non_blocking=true);
187  virtual int SetReuseAddr(DSL_SOCKET * sock, bool reuse_addr=true);
188  virtual int SetLinger(DSL_SOCKET * sock, bool linger, unsigned short timeo=30);
189  virtual int SetNoDelay(DSL_SOCKET * sock, bool no_delay=true);
190  virtual int SetKeepAlive(DSL_SOCKET * sock, bool ka=true);
191  virtual int SetBroadcast(DSL_SOCKET * sock, bool broadcast=true);
192  virtual bool DisableUDPConnReset(DSL_SOCKET * sock, bool noconnreset);
193 
194  virtual std::string GetHostIP(const char * host, int type=SOCK_STREAM, int proto=IPPROTO_TCP);
195 };
196 
197 class DSL_API_CLASS DSL_Sockets3_SSL: public DSL_Sockets3_Base {
198  friend class DSL_Sockets3_Base;
199  protected:
200  virtual DSL_SOCKET * pAllocSocket() = 0;
201  virtual int pRecv(DSL_SOCKET * sock, char * buf, uint32 bufsize) = 0;
202  virtual int pPeek(DSL_SOCKET * sock, char * buf, uint32 bufsize) = 0;
203  virtual int pSend(DSL_SOCKET * sock, const char * buf, uint32 bufsize) = 0;
204  virtual void pCloseSSL(DSL_SOCKET * sock) = 0;
205  virtual int pSelect_Read(DSL_SOCKET * sock, timeval * timeo) { return DSL_Sockets3_Base::pSelect_Read(sock, timeo); }
206  public:
207  virtual ~DSL_Sockets3_SSL() {}
208 
209  virtual bool EnableSSL(const char * cert_fn, DS3_SSL_METHOD method) = 0;
210  virtual bool SwitchToSSL_Server(DSL_SOCKET * sock) = 0;
211  virtual bool SwitchToSSL_Client(DSL_SOCKET * sock) = 0;
212 };
213 
214 #if defined(ENABLE_OPENSSL)
215 #define DSL_Sockets3 DSL_Sockets3_OpenSSL
216 #elif defined(ENABLE_GNUTLS)
217 #define DSL_Sockets3 DSL_Sockets3_GnuTLS
218 #else
219 #define DSL_Sockets3 DSL_Sockets3_Base
220 #endif
221 
222 #define RL3_ERROR -4
223 #define RL3_CLOSED -3
224 #define RL3_LINETOOLONG -2
225 #define RL3_NOLINE -1
226 
227 #define DS3_FLAG_SSL 0x00000001
228 #define DS3_FLAG_ZIP 0x00000002
229 
230 #define DSL_Sockets DSL_Sockets3
231 
234 #endif // __DSL_SOCKETS3_H__
DS3_SSL_METHOD
Definition: sockets3.h:67
@ DS3_SSL_METHOD_TLS1_0
this is the minimum you should use
Definition: sockets3.h:72
@ DS3_SSL_METHOD_DTLS1
Datagram TLS, consider this untested.
Definition: sockets3.h:75
@ DS3_SSL_METHOD_TLS
Attempt highest TLS version, falling back to lower versions to 1.0.
Definition: sockets3.h:68