• Main Page
  • Namespaces
  • Classes
  • Files
  • Examples

socket.h

Go to the documentation of this file.
00001 // Copyright (C) 1999-2005 Open Source Telecom Corporation.
00002 //
00003 // This program is free software; you can redistribute it and/or modify
00004 // it under the terms of the GNU General Public License as published by
00005 // the Free Software Foundation; either version 2 of the License, or
00006 // (at your option) any later version.
00007 //
00008 // This program is distributed in the hope that it will be useful,
00009 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00010 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00011 // GNU General Public License for more details.
00012 //
00013 // You should have received a copy of the GNU General Public License
00014 // along with this program; if not, write to the Free Software
00015 // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
00016 //
00017 // As a special exception, you may use this file as part of a free software
00018 // library without restriction.  Specifically, if other files instantiate
00019 // templates or use macros or inline functions from this file, or you compile
00020 // this file and link it with other files to produce an executable, this
00021 // file does not by itself cause the resulting executable to be covered by
00022 // the GNU General Public License.  This exception does not however
00023 // invalidate any other reasons why the executable file might be covered by
00024 // the GNU General Public License.
00025 //
00026 // This exception applies only to the code released under the name GNU
00027 // Common C++.  If you copy code from other releases into a copy of GNU
00028 // Common C++, as the General Public License permits, the exception does
00029 // not apply to the code that you add in this way.  To avoid misleading
00030 // anyone as to the status of such modified files, you must delete
00031 // this exception notice from them.
00032 //
00033 // If you write modifications of your own for GNU Common C++, it is your choice
00034 // whether to permit this exception to apply to your modifications.
00035 // If you do not wish that, delete this exception notice.
00036 //
00037 
00043 #ifndef CCXX_SOCKET_H_
00044 #define CCXX_SOCKET_H_
00045 
00046 #ifndef CCXX_ADDRESS_H_
00047 #include <cc++/address.h>
00048 #endif
00049 
00050 #if defined(WIN32) && !defined(__CYGWIN32__)
00051 #include <io.h>
00052 #define _IOLEN64        (unsigned)
00053 #define _IORET64        (int)
00054 #define TIMEOUT_INF ~((timeout_t) 0)
00055 typedef int socklen_t;
00056 #else
00057 #define INVALID_SOCKET  -1
00058 typedef int SOCKET;
00059 #endif
00060 
00061 #ifndef _IOLEN64
00062 #define _IOLEN64
00063 #endif
00064 
00065 #ifndef _IORET64
00066 #define _IORET64
00067 #endif
00068 
00069 #ifndef MSG_DONTWAIT
00070 #define MSG_DONTWAIT    0
00071 #endif
00072 
00073 #ifndef MSG_NOSIGNAL
00074 #define MSG_NOSIGNAL    0
00075 #endif
00076 
00077 #ifdef  CCXX_NAMESPACES
00078 namespace ost {
00079 #endif
00080 
00084 typedef unsigned short tpport_t;
00085 
00103 class __EXPORT Socket
00104 {
00105 public:
00106         enum Family {
00107 #ifdef  CCXX_IPV6
00108                 IPV6 = AF_INET6,
00109 #endif
00110                 IPV4 = AF_INET
00111         };
00112 
00113         typedef enum Family Family;
00114 
00115         enum Error {
00116                 errSuccess = 0,
00117                 errCreateFailed,
00118                 errCopyFailed,
00119                 errInput,
00120                 errInputInterrupt,
00121                 errResourceFailure,
00122                 errOutput,
00123                 errOutputInterrupt,
00124                 errNotConnected,
00125                 errConnectRefused,
00126                 errConnectRejected,
00127                 errConnectTimeout,
00128                 errConnectFailed,
00129                 errConnectInvalid,
00130                 errConnectBusy,
00131                 errConnectNoRoute,
00132                 errBindingFailed,
00133                 errBroadcastDenied,
00134                 errRoutingDenied,
00135                 errKeepaliveDenied,
00136                 errServiceDenied,
00137                 errServiceUnavailable,
00138                 errMulticastDisabled,
00139                 errTimeout,
00140                 errNoDelay,
00141                 errExtended,
00142                 errLookupFail,
00143                 errSearchErr,
00144                 errInvalidValue
00145         };
00146 
00147         typedef enum Error Error;
00148 
00149         enum Tos {
00150                 tosLowDelay = 0,
00151                 tosThroughput,
00152                 tosReliability,
00153                 tosMinCost,
00154                 tosInvalid
00155         };
00156         typedef enum Tos Tos;
00157 
00158         enum Pending {
00159                 pendingInput,
00160                 pendingOutput,
00161                 pendingError
00162         };
00163         typedef enum Pending Pending;
00164 
00165 protected:
00166         enum State {
00167                 INITIAL,
00168                 AVAILABLE,
00169                 BOUND,
00170                 CONNECTED,
00171                 CONNECTING,
00172                 STREAM
00173         };
00174         typedef enum State State;
00175 
00176 private:
00177         // used by exception handlers....
00178         mutable Error errid;
00179         mutable const char *errstr;
00180         mutable long syserr;
00181 
00182         void setSocket(void);
00183         friend SOCKET dupSocket(SOCKET s,Socket::State state);
00184 
00185 protected:
00186         static Mutex mutex;
00187 
00188         mutable struct {
00189                 bool thrown: 1;
00190                 bool broadcast: 1;
00191                 bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;