00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00026 #ifndef HH_SENF_PPI_SocketSink_
00027 #define HH_SENF_PPI_SocketSink_ 1
00028
00029
00030 #include <senf/Packets/Packets.hh>
00031 #include <senf/Socket/ClientSocketHandle.hh>
00032 #include <senf/Socket/SocketPolicy.hh>
00033 #include <senf/Socket/ReadWritePolicy.hh>
00034 #include <senf/Socket/FramingPolicy.hh>
00035 #include <senf/Socket/CommunicationPolicy.hh>
00036 #include "Module.hh"
00037 #include "Connectors.hh"
00038 #include <senf/Socket/Protocols/INet/INetAddressing.hh>
00039 #include "IOEvent.hh"
00040
00041
00042
00043
00044 namespace senf {
00045 namespace ppi {
00046
00051 class ConnectedDgramWriter
00052 {
00053 public:
00054 typedef senf::ClientSocketHandle<
00055 senf::MakeSocketPolicy< senf::WriteablePolicy,
00056 senf::DatagramFramingPolicy,
00057 senf::ConnectedCommunicationPolicy>::policy > Handle;
00059 typedef Packet PacketType;
00060
00061 bool operator()(Handle & handle, Packet const & packet);
00063
00067 };
00068
00076 template <class HandleType>
00077 class TargetDgramWriter
00078 {
00079 public:
00080 typedef HandleType Handle;
00081 typedef Packet PacketType;
00082
00083 TargetDgramWriter();
00084 TargetDgramWriter(typename Handle::Address const & target);
00086
00087 typename Handle::Address target() const;
00088 void target(typename Handle::Address const & target);
00089
00090 bool operator()(Handle & handle, Packet const & packet);
00091
00096 private:
00097 typename Handle::Address target_;
00098 };
00099
00100 class IPv4SourceForcingDgramWriter : ConnectedDgramWriter
00101 {
00102 public:
00103 IPv4SourceForcingDgramWriter();
00104 IPv4SourceForcingDgramWriter(senf::INet4Address sourceAddr, senf::INet4SocketAddress destAddr);
00105 typedef senf::ClientSocketHandle<
00106 senf::MakeSocketPolicy< senf::WriteablePolicy,
00107 senf::DatagramFramingPolicy>::policy > Handle;
00109 typedef Packet PacketType;
00110
00111 void source(senf::INet4Address & source);
00112 senf::INet4Address source();
00113 void destination(senf::INet4SocketAddress & dest);
00114 senf::INet4SocketAddress destination();
00115
00116 bool operator()(Handle & handle, Packet const & packet);
00118
00122 private:
00123 int sendtoandfrom(int sock, const void *data, size_t dataLen, const in_addr *dst, int port, const in_addr *src);
00124 senf::INet4Address source_;
00125 senf::INet4Address destination_;
00126 unsigned int protocolId_;
00127 };
00128
00129 class IPv6SourceForcingDgramWriter : ConnectedDgramWriter
00130 {
00131 public:
00132 IPv6SourceForcingDgramWriter();
00133 IPv6SourceForcingDgramWriter(senf::INet6Address sourceAddr, senf::INet6SocketAddress destAddr);
00134 typedef senf::ClientSocketHandle<
00135 senf::MakeSocketPolicy< senf::WriteablePolicy,
00136 senf::DatagramFramingPolicy>::policy > Handle;
00138 typedef Packet PacketType;
00139
00140 void source(senf::INet6Address & source);
00141 senf::INet6Address source();
00142 void destination(senf::INet6SocketAddress & dest);
00143 senf::INet6SocketAddress destination();
00144
00145 bool operator()(Handle & handle, Packet const & packet);
00147
00151 private:
00152 int sendtoandfrom(int sock, const void *data, size_t dataLen, const in6_addr *dst, int port, const in6_addr *src);
00153 senf::INet6Address source_;
00154 senf::INet6Address destination_;
00155 unsigned int protocolId_;
00156 };
00157
00158
00159 }}
00160
00161 namespace senf {
00162 namespace ppi {
00163 namespace module {
00164
00194 template <class Writer=ConnectedDgramWriter>
00195 class ActiveSocketSink : public Module
00196 {
00197 SENF_PPI_MODULE(ActiveSocketSink);
00198
00199 public:
00200 typedef typename Writer::Handle Handle;
00201
00202 connector::ActiveInput<typename Writer::PacketType> input;
00203
00204 ActiveSocketSink();
00205
00207 explicit ActiveSocketSink(Writer const & writer);
00209
00213 explicit ActiveSocketSink(Handle const & handle);
00215
00218 ActiveSocketSink(Handle const & handle, Writer const & writer);
00220
00226 Writer & writer();
00227 Handle handle();
00228 void handle(Handle const & handle);
00230
00233 private:
00234 void write();
00235
00236 Handle handle_;
00237 IOEvent event_;
00238 Writer writer_;
00239 };
00240
00272 template <class Writer=ConnectedDgramWriter>
00273 class PassiveSocketSink : public Module
00274 {
00275 SENF_PPI_MODULE(PassiveSocketSink);
00276
00277 public:
00278 typedef typename Writer::Handle Handle;
00279
00280 connector::PassiveInput<typename Writer::PacketType> input;
00281
00282 PassiveSocketSink();
00283
00285 explicit PassiveSocketSink(Writer const & writer);
00287
00291 explicit PassiveSocketSink(Handle const & handle);
00293
00296 PassiveSocketSink(Handle const & handle, Writer const & writer);
00298
00304 Writer & writer();
00305 Handle & handle();
00306 void handle(Handle const & handle);
00308
00311 #ifndef DOXYGEN
00312 void replaceHandle(Handle newHandle);
00313 #endif
00314
00315 private:
00316 void write();
00317 void checkThrottle();
00318
00319 Handle handle_;
00320 Writer writer_;
00321 };
00322
00323 }}}
00324
00325
00326
00327 #include "SocketSink.cci"
00328 #include "SocketSink.ct"
00329 #include "SocketSink.cti"
00330 #endif
00331
00332
00333
00334
00335
00336
00337
00338
00339
00340
00341