Changeset 4632ff7 in nscp for include/socket/socket_helpers.hpp
- Timestamp:
- 08/22/11 21:43:56 (22 months ago)
- Branches:
- master, 0.4.0, 0.4.1, 0.4.2
- Children:
- 0b8df3e
- Parents:
- bd18eb2
- File:
-
- 1 edited
-
include/socket/socket_helpers.hpp (modified) (6 diffs)
Legend:
- Unmodified
- Added
- Removed
-
include/socket/socket_helpers.hpp
rbd18eb2 r4632ff7 5 5 #include <boost/bind.hpp> 6 6 #include <boost/optional.hpp> 7 #include <boost/shared_ptr.hpp> 8 #include <boost/enable_shared_from_this.hpp> 7 9 8 10 #include <unicode_char.hpp> … … 117 119 void set_result(boost::optional<boost::system::error_code>* a, boost::system::error_code b); 118 120 119 struct timed_writer : boost::noncopyable{121 struct timed_writer : public boost::enable_shared_from_this<timed_writer> { 120 122 boost::asio::io_service &io_service; 121 123 boost::posix_time::time_duration duration; … … 125 127 boost::optional<boost::system::error_code> read_result; 126 128 127 timed_writer(boost::asio::io_service &io_service, boost::posix_time::time_duration duration) 128 : io_service(io_service) 129 , timer(io_service) 130 { 129 timed_writer(boost::asio::io_service& io_service) : io_service(io_service), timer(io_service) {} 130 ~timed_writer() { 131 timer.cancel(); 132 } 133 void start_timer(boost::posix_time::time_duration duration) { 131 134 timer.expires_from_now(duration); 132 timer.async_wait(boost::bind( set_result, &timer_result, _1));133 } 134 ~timed_writer() {135 timer.async_wait(boost::bind(&timed_writer::set_result, shared_from_this(), &timer_result, _1)); 136 } 137 void stop_timer() { 135 138 timer.cancel(); 136 139 } 137 140 138 141 template <typename AsyncWriteStream, typename MutableBufferSequence> 139 void write(AsyncWriteStream& s ocket, MutableBufferSequence &buffer) {140 async_write(s ocket, buffer, boost::bind(set_result, &read_result, _1));141 } 142 143 template <typename AsyncWriteStream, typename RawSocket, typename MutableBufferSequence>144 bool write_and_wait(AsyncWriteStream& s ock, RawSocket& rawSocket, const MutableBufferSequence& buffer) {145 write(s ock, buffer);146 return wait( rawSocket);147 } 148 149 template <typename RawSocket>150 bool wait( RawSocket& socket) {142 void write(AsyncWriteStream& stream, MutableBufferSequence &buffer) { 143 async_write(stream, buffer, boost::bind(&timed_writer::set_result, shared_from_this(), &read_result, _1)); 144 } 145 146 template <typename AsyncWriteStream, typename Socket, typename MutableBufferSequence> 147 bool write_and_wait(AsyncWriteStream& stream, Socket& socket, const MutableBufferSequence& buffer) { 148 write(stream, buffer); 149 return wait(socket); 150 } 151 152 template<typename Socket> 153 bool wait(Socket& socket) { 151 154 io_service.reset(); 152 155 while (io_service.run_one()) { 153 156 if (read_result) { 157 read_result.reset(); 154 158 return true; 155 159 } … … 160 164 } 161 165 } 166 167 void set_result(boost::optional<boost::system::error_code>* a, boost::system::error_code ec) { 168 if (!ec) 169 a->reset(ec); 170 } 171 162 172 }; 163 173 … … 186 196 187 197 188 struct timed_reader : boost::noncopyable{198 struct timed_reader : public boost::enable_shared_from_this<timed_reader> { 189 199 boost::asio::io_service &io_service; 190 200 boost::posix_time::time_duration duration; … … 194 204 boost::optional<boost::system::error_code> write_result; 195 205 196 timed_reader(boost::asio::io_service &io_service, boost::posix_time::time_duration duration) 197 : io_service(io_service) 198 , timer(io_service) 199 { 206 timed_reader(boost::asio::io_service &io_service) : io_service(io_service), timer(io_service) {} 207 ~timed_reader() { 208 timer.cancel(); 209 } 210 211 void start_timer(boost::posix_time::time_duration duration) { 200 212 timer.expires_from_now(duration); 201 timer.async_wait(boost::bind( set_result, &timer_result, _1));202 } 203 ~timed_reader() {213 timer.async_wait(boost::bind(&timed_reader::set_result, shared_from_this(), &timer_result, _1)); 214 } 215 void stop_timer() { 204 216 timer.cancel(); 205 217 } 206 218 207 219 template <typename AsyncWriteStream, typename MutableBufferSequence> 208 void read(AsyncWriteStream& socket, const MutableBufferSequence &buffers) { 209 async_read(socket, buffers, boost::bind(set_result, &write_result, _1)); 210 } 211 212 template <typename AsyncWriteStream, typename MutableBufferSequence> 213 bool read_and_wait(AsyncWriteStream& sock, const MutableBufferSequence& buffers) { 214 read(sock, buffers); 215 return wait(); 216 } 217 bool wait() { 220 void read(AsyncWriteStream& stream, const MutableBufferSequence &buffers) { 221 async_read(stream, buffers, boost::bind(&timed_reader::set_result, shared_from_this(), &write_result, _1)); 222 } 223 224 template <typename AsyncWriteStream, typename Socket, typename MutableBufferSequence> 225 bool read_and_wait(AsyncWriteStream& stream, Socket& socket, const MutableBufferSequence& buffers) { 226 read(stream, buffers); 227 return wait(socket); 228 } 229 template <typename Socket> 230 bool wait(Socket& socket) { 218 231 io_service.reset(); 219 232 while (io_service.run_one()) { 220 233 if (write_result) { 221 std::cout << "---read---" << std::endl; 222 //timer.cancel(); 234 write_result.reset(); 223 235 return true; 224 236 } 225 237 else if (timer_result) { 226 std::cout << "---timer (read)---" << std::endl; 227 //socket.close(); 238 socket.close(); 228 239 return false; 229 240 } 230 241 } 231 242 } 243 void set_result(boost::optional<boost::system::error_code>* a, boost::system::error_code ec) { 244 if (!ec) 245 a->reset(ec); 246 } 247 232 248 }; 233 249
Note: See TracChangeset
for help on using the changeset viewer.








