00001 #ifndef _BOOST_CMT_ASIO_TCP_SOCKET_HPP
00002 #define _BOOST_CMT_ASIO_TCP_SOCKET_HPP
00003 #include <boost/asio.hpp>
00004
00005 namespace boost { namespace cmt { namespace asio { namespace tcp {
00006
00010 class socket : public boost::asio::ip::tcp::socket {
00011 public:
00012 typedef boost::shared_ptr<socket> ptr;
00013
00014 socket();
00015 ~socket();
00016
00017 boost::system::error_code connect( const boost::asio::ip::tcp::endpoint& ep );
00018
00022 struct iterator : public std::iterator<std::input_iterator_tag,char,void> {
00023 iterator( boost::cmt::asio::tcp::socket* _s = NULL)
00024 :s(_s){ if(_s){++*this;} }
00025
00026 inline const char& operator*()const { return value; }
00027 inline const char* operator->()const { return &value; }
00028 inline char& operator*() { return value; }
00029 inline char* operator->(){ return &value; }
00030
00031 iterator& operator++();
00032 iterator operator++(int);
00033
00034 bool operator == ( const iterator& i )const { return s == i.s; }
00035 bool operator != ( const iterator& i )const { return s != i.s; }
00036
00037 private:
00038 char value;
00039 boost::cmt::asio::tcp::socket* s;
00040 };
00041
00042 size_t read_some( char* buffer, size_t size );
00043 size_t read( char* buffer, size_t size );
00044 size_t try_read( char* buffer, size_t size );
00045 size_t write( const char* buffer, size_t size );
00046
00047 private:
00048 void write_loop( uint8_t write_buf_idx );
00049 std::vector<char> read_buf;
00050 std::vector<char> write_buf[2];
00051 std::vector<char>* cur_write_buf;
00052
00053 uint8_t cur_wbuf_idx;
00054 size_t read_pos;
00055 size_t last_avail;
00056 };
00057
00058 } } } }
00059
00060 #endif