00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00024 #ifndef SCALESTACK_NETWORK_DATAGRAM_H
00025 #define SCALESTACK_NETWORK_DATAGRAM_H
00026
00027 #include <memory>
00028 #include <stdint.h>
00029 #include <sys/socket.h>
00030 #include <sys/types.h>
00031
00032 #include <scalestack/event/handler.h>
00033 #include <scalestack/kernel/macros.h>
00034
00035 struct addrinfo;
00036
00037 namespace scalestack
00038 {
00039 namespace network
00040 {
00041
00042 class datagram_provider;
00043 class datagram_service;
00044
00048 class datagram
00049 {
00050 public:
00051
00052 datagram(kernel::module& module);
00053
00054 virtual ~datagram();
00055
00059 virtual void started(void);
00060
00064 virtual void shutdown(void);
00065
00069 void stop(void);
00070
00074 void set_timer(uint64_t milliseconds);
00075
00079 virtual void timer_expired(void);
00080
00084 void run_now(void);
00085
00089 virtual void run(void);
00090
00101 virtual size_t receive(uint8_t* buffer,
00102 size_t size,
00103 struct sockaddr& peer,
00104 socklen_t peer_size) = 0;
00105
00115 void consume(size_t size);
00116
00128 size_t send(uint8_t* buffer,
00129 size_t size,
00130 const struct sockaddr& peer,
00131 socklen_t peer_size);
00132
00141 size_t send(uint8_t* buffer, size_t size);
00142
00148 virtual void flush_send(void) = 0;
00149
00150 protected:
00151
00152 kernel::module& _module;
00153
00154 private:
00155
00159 datagram(const datagram&);
00160
00164 datagram& operator=(const datagram&);
00165
00166 datagram_provider* _datagram_provider;
00167
00168 friend class datagram_provider;
00169 };
00170
00174 class SCALESTACK_API datagram_provider: public event::handler
00175 {
00176 public:
00177
00189 datagram_provider(event::handler_service& handler_service,
00190 datagram_service& datagram_service,
00191 const struct addrinfo* local,
00192 const struct addrinfo* peer);
00193
00194 virtual ~datagram_provider();
00195
00199 void started();
00200
00204 void shutdown(void);
00205
00209 void timer_expired(void);
00210
00214 void run(void);
00215
00219 virtual void set_file_descriptor(int file_descriptor);
00220
00224 void consume(size_t size);
00225
00229 size_t send(uint8_t* buffer,
00230 size_t size,
00231 const struct sockaddr& peer,
00232 socklen_t peer_size);
00233
00237 size_t send(uint8_t* buffer, size_t size);
00238
00239 private:
00240
00244 SCALESTACK_LOCAL
00245 datagram_provider(const datagram_provider&);
00246
00250 SCALESTACK_LOCAL
00251 datagram_provider& operator=(const datagram_provider&);
00252
00260 void read_ready(int file_descriptor);
00261
00268 void write_ready(int file_descriptor);
00269
00270 static const size_t _receive_buffer_max_size = 64 * 1024;
00271
00272 int _file_descriptor;
00273 socklen_t _peer_size;
00274 size_t _receive_buffer_size;
00275 std::auto_ptr<datagram> _datagram;
00276 datagram_service& _datagram_service;
00277 struct sockaddr* _peer;
00278 struct sockaddr_storage _peer_storage;
00279 uint8_t _receive_buffer[_receive_buffer_max_size];
00280 };
00281
00282
00283
00284
00285
00286 inline datagram::datagram(kernel::module& module):
00287 _module(module),
00288 _datagram_provider()
00289 {
00290 }
00291
00292 inline datagram::~datagram()
00293 {
00294 }
00295
00296 inline void datagram::started(void)
00297 {
00298 }
00299
00300 inline void datagram::shutdown(void)
00301 {
00302 _datagram_provider->stop();
00303 }
00304
00305 inline void datagram::stop(void)
00306 {
00307 _datagram_provider->stop();
00308 }
00309
00310 inline void datagram::set_timer(uint64_t milliseconds)
00311 {
00312 _datagram_provider->set_timer(milliseconds);
00313 }
00314
00315 inline void datagram::timer_expired(void)
00316 {
00317 }
00318
00319 inline void datagram::run_now(void)
00320 {
00321 _datagram_provider->run_now();
00322 }
00323
00324 inline void datagram::run(void)
00325 {
00326 }
00327
00328 inline void datagram::consume(size_t size)
00329 {
00330 _datagram_provider->consume(size);
00331 }
00332
00333 inline size_t datagram::send(uint8_t* buffer,
00334 size_t size,
00335 const struct sockaddr& peer,
00336 socklen_t peer_size)
00337 {
00338 return _datagram_provider->send(buffer, size, peer, peer_size);
00339 }
00340
00341 inline size_t datagram::send(uint8_t* buffer, size_t size)
00342 {
00343 return _datagram_provider->send(buffer, size);
00344 }
00345
00346
00347
00348
00349
00350 inline void datagram_provider::shutdown(void)
00351 {
00352 _datagram->shutdown();
00353 }
00354
00355 inline void datagram_provider::timer_expired(void)
00356 {
00357 _datagram->timer_expired();
00358 }
00359
00360 inline void datagram_provider::run(void)
00361 {
00362 _datagram->run();
00363 }
00364
00365 inline void datagram_provider::write_ready(int)
00366 {
00367 _datagram->flush_send();
00368 }
00369
00370 }
00371 }
00372
00373 #endif