Search:

SENF Extensible Network Framework

  • Home
  • Download
  • Wiki
  • BerliOS
  • ChangeLog
  • Browse SVN
  • Bug Tracker
  • Overview
  • Examples
  • HowTos
  • Glossary
  • PPI
  • Packets
  • Scheduler
  • Socket
  • Utils
  • Console
  • Daemon
  • Logger
  • Termlib
  • Main Page
  • Related Pages
  • Modules
  • Namespaces
  • Classes
  • Files
  • Directories
  • File List
  • File Members

SocketSink.hh

Go to the documentation of this file.
00001 // $Id: SocketSink.hh 1742 2010-11-04 14:51:56Z g0dil $
00002 //
00003 // Copyright (C) 2007
00004 // Fraunhofer (FOKUS)
00005 // Competence Center NETwork research (NET), St. Augustin, GERMANY
00006 //     Stefan Bund <g0dil@berlios.de>
00007 //
00008 // This program is free software; you can redistribute it and/or modify
00009 // it under the terms of the GNU General Public License as published by
00010 // the Free Software Foundation; either version 2 of the License, or
00011 // (at your option) any later version.
00012 //
00013 // This program is distributed in the hope that it will be useful,
00014 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00015 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00016 // GNU General Public License for more details.
00017 //
00018 // You should have received a copy of the GNU General Public License
00019 // along with this program; if not, write to the
00020 // Free Software Foundation, Inc.,
00021 // 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
00022 
00026 #ifndef HH_SENF_PPI_SocketSink_
00027 #define HH_SENF_PPI_SocketSink_ 1
00028 
00029 // Custom includes
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 //#include "SocketSink.mpp"
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 // Local Variables:
00334 // mode: c++
00335 // fill-column: 100
00336 // c-file-style: "senf"
00337 // indent-tabs-mode: nil
00338 // ispell-local-dictionary: "american"
00339 // compile-command: "scons -u test"
00340 // comment-column: 40
00341 // End:

Contact: senf-dev@lists.berlios.de | © 2006-2010 Fraunhofer Institute for Open Communication Systems, Network Research