00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00027 #ifndef HH_SENF_Socket_ClientSocketHandle_
00028 #define HH_SENF_Socket_ClientSocketHandle_ 1
00029
00030
00031 #include <boost/call_traits.hpp>
00032 #include <boost/range.hpp>
00033 #include <boost/utility.hpp>
00034 #include <boost/type_traits.hpp>
00035 #include "SocketHandle.hh"
00036
00037
00038
00039
00040 namespace senf {
00041
00043
00044
00045 template <class SPolicy> class ServerSocketHandle;
00046
00088 template <class SPolicy>
00089 class ClientSocketHandle
00090 : public SocketHandle<SPolicy>
00091 {
00092 public:
00093
00094
00095
00097 typedef typename SPolicy::AddressingPolicy::Address Address;
00099
00104 typedef typename boost::call_traits<Address>::param_type AddressParam;
00106
00109 typedef ServerSocketHandle<SPolicy> ServerHandle;
00110
00111
00113
00114
00115
00116
00117
00118
00119
00120
00121 ClientSocketHandle();
00122
00123
00124 # ifndef DOXYGEN
00125 template <class OtherPolicy>
00126 ClientSocketHandle(ClientSocketHandle<OtherPolicy> other,
00127 typename SocketHandle<SPolicy>::template IsCompatible<OtherPolicy>::type * = 0);
00128 # else
00129 ClientSocketHandle(ClientSocketHandle<OtherPolicy> other);
00130 # endif
00131
00132 # ifndef DOXYGEN
00133 template <class OtherPolicy>
00134 typename SocketHandle<SPolicy>::template IsCompatible<OtherPolicy>::type const &
00135 operator=(ClientSocketHandle<OtherPolicy> other);
00136 # else
00137 template <class OtherPolicy>
00138 ClientSocketHandle<OtherPolicy> const & operator=(ClientSocketHandle<OtherPolicy> other);
00139 # endif
00140
00141
00142
00143
00144
00146
00147
00178 std::string read (unsigned limit=0);
00179 template <class ForwardWritableRange>
00180 # ifndef DOXYGEN
00181 typename boost::range_iterator<ForwardWritableRange>::type
00182 read (ForwardWritableRange const & range,
00183 typename boost::disable_if< boost::is_convertible<ForwardWritableRange,unsigned> >::type * = 0);
00184 # else
00185 typename boost::range_iterator<ForwardWritableRange>::type
00186 read (ForwardWritableRange const & range);
00188
00199 # endif
00200 # ifndef DOXYGEN
00201 template <class ForwardWritableRange>
00202 typename boost::range_iterator<ForwardWritableRange>::type
00203 read (ForwardWritableRange & range,
00204 typename boost::disable_if< boost::is_convertible<ForwardWritableRange,unsigned> >::type * = 0);
00205 # else
00206 template <class ForwardWritableRange>
00207 typename boost::range_iterator<ForwardWritableRange>::type
00208 read (ForwardWritableRange & range);
00210
00213 # endif
00214 template <class Sequence>
00215 void read (Sequence & container, unsigned limit);
00217
00224 char * read (char * start, char * end);
00226
00251 std::pair<std::string, Address>
00252 readfrom (unsigned limit=0);
00253 template <class ForwardWritableRange>
00254 typename boost::range_iterator<ForwardWritableRange const>::type
00255 readfrom (ForwardWritableRange const & range, Address & from);
00257
00270 template <class ForwardWritableRange>
00271 typename boost::range_iterator<ForwardWritableRange>::type
00272 readfrom (ForwardWritableRange & range, Address & from);
00274
00277 template <class Sequence>
00278 void readfrom (Sequence & container, Address & from, unsigned limit);
00280
00289 char * readfrom (char * start, char * end, Address & from);
00291
00322 template <class ForwardReadableRange>
00323 typename boost::range_const_iterator<ForwardReadableRange const>::type
00324 write (ForwardReadableRange const & range);
00325 char const * write (char const * start, char const * end);
00327
00351 template <class ForwardReadableRange>
00352 typename boost::range_const_iterator<ForwardReadableRange const>::type
00353 writeto (AddressParam addr, ForwardReadableRange const & range);
00354 char const * writeto (AddressParam addr, char const * start, char const * end);
00356
00363
00365
00366
00377 void connect (AddressParam addr) const;
00378
00388 void bind (AddressParam addr) const;
00389
00401 Address peer () const;
00402 void peer (Address & addr) const;
00404
00416 Address local () const;
00417 void local (Address & addr) const;
00419
00421
00422
00423 static ClientSocketHandle cast_static(FileHandle handle);
00424 static ClientSocketHandle cast_dynamic(FileHandle handle);
00425
00426
00427 void state(SocketStateMap & map, unsigned lod=0);
00428 std::string dumpState(unsigned lod=0);
00429
00430 unsigned available();
00431
00432 protected:
00433 ClientSocketHandle(FileHandle other, bool isChecked);
00434 explicit ClientSocketHandle(std::auto_ptr<SocketBody> body);
00435
00436 private:
00437 friend class senf::ServerSocketHandle<SPolicy>;
00438 };
00439
00440
00441 }
00442
00443
00444
00445 #include "ClientSocketHandle.ct"
00446 #include "ClientSocketHandle.cti"
00447 #endif
00448
00449
00450
00451
00452
00453
00454
00455
00456
00457
00458