00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #ifndef __SSLSOCKET_H__
00027 #define __SSLSOCKET_H__
00028
00052
00053 #include <cbits/Socket.h>
00054 #include <cbits/SSLContext.h>
00055 #include <cbits/SocketException.h>
00056 #include <cbits/SocketException.h>
00057
00058
00059 #include <openssl/bio.h>
00060 #include <openssl/err.h>
00061 #include <openssl/rand.h>
00062 #include <openssl/ssl.h>
00063
00064
00065 namespace cbits {
00066
00067 class SSLPeer;
00068
00101 class EXPORT SSLSocket : public virtual Socket
00102 {
00103
00104 public:
00105
00114 SSLSocket
00115 (
00116 const std::string& host,
00118 const int port,
00120 SSLContext* const ctxt=0,
00126 const bool now=true
00127 )
00128 throw( SocketException );
00129
00130
00139 SSLSocket
00140 (
00141 const char *host,
00143 const int port,
00145 SSLContext* const ctxt=0,
00151 const bool now=true
00152 )
00153 throw( SocketException );
00154
00155
00162 virtual ~SSLSocket();
00163
00164
00165 virtual void connect() throw(SocketException);
00166
00167 virtual const ssize_t read
00168 (
00169 char * const buffer,
00170 const int buflen,
00171 int * const error=0,
00172 const long int msec=0
00173 )
00174 throw( SocketException );
00175
00176
00177 virtual const ssize_t receive
00178 (
00179 char * const buffer,
00180 const int buflen,
00181 const long int msec=0,
00182 int * const error=0
00183 )
00184 throw( SocketException );
00185
00186
00187 virtual const ssize_t readLine
00188 (
00189 std::string& buffer,
00190 const std::string& delim,
00191 int * const error=0,
00192 const long int msec=0
00193 )
00194 throw( SocketException );
00195
00196
00197 virtual const ssize_t write
00198 (
00199 const char * buffer,
00200 const long buflen,
00201 int * const error=0,
00202 const long int msec=0
00203 )
00204 throw( SocketException );
00205
00206
00207 virtual const ssize_t send
00208 (
00209 const char * buffer,
00210 const long buflen,
00211 int * const error=0,
00212 const long int msec=0
00213 )
00214 throw( SocketException );
00215
00216
00227 static SSLSocket* create
00228 (
00229 const socket_t fd,
00230 SSLContext* const ctxt=0
00235 )
00236 throw( SocketException );
00237
00238
00249 static void setGlobalContext
00250 (
00251 SSLContext* gctx
00252 )
00253 throw( SSLContextException );
00254
00255
00256
00263 const SSLPeer& getPeer() const
00264 throw( SocketException );
00265
00266
00273 typedef SSL* SSL_PTR;
00274
00275
00282 inline operator SSL_PTR() { return _ssl; }
00283
00284
00285 protected:
00286
00291 SSLSocket
00292 (
00293 const socket_t fd,
00294 SSLContext* const ctxt=0
00299 )
00300 throw( SocketException );
00301
00305
00306
00307
00308
00314 bool _ssl_is_connected;
00315
00316
00317 private:
00318
00323 void set_bio
00324 (
00325 const socket_t fd
00326 )
00327 throw( SocketException );
00328
00335 BIO* _bio;
00336
00337
00341 SSLContext* _ctxt;
00342
00343
00347 SSL* _ssl;
00348
00349
00353 SSLPeer* _peer;
00354
00355
00360 mutable CriticalSection _csect;
00361
00362
00368 mutable CriticalSection _read_csect;
00369
00370
00376 mutable CriticalSection _write_csect;
00377
00378
00382 static SSLContext* _global_ctxt;
00383 };
00384
00385
00386
00387
00388
00389 };
00390 #endif
00391
00392
00393
00394
00395
00396
00397
00398
00399
00400
00401
00402
00403
00404
00405
00406
00407
00408
00409
00410
00411
00412
00413