senf::ConnectedCommunicationPolicy>::policy > Handle;
///< Handle type supported by this writer
- void operator()(Handle handle, Packet packet);
+ void operator()(Handle handle, Packet const & packet);
///< Write \a packet to \a handle
/**< Write the complete \a packet as a datagram to \a
handle.
\param[in] packet Packet to write */
};
+ /** \brief Writer sending data with ClientSocketHandle::writeto()
+
+ This writer will send out data using ClientSocketHandle::writeto(). The target address can
+ be specified in the writer constructor and can be adjusted at any time.
+
+ If no target address is set, incoming data will be <em>silently dropped</em>.
+ */
+ template <class HandleType>
+ class TargetDgramWriter
+ {
+ public:
+ typedef HandleType Handle;
+
+ TargetDgramWriter(); ///< Create TargetDgramWriter with unset target address
+ TargetDgramWriter(typename Handle::Address const & target);
+ ///< Create TargetDgramWriter sending to \a target
+
+ typename Handle::Address target() const; ///< Get current target address
+ void target(typename Handle::Address const & target); ///< Set target address
+
+ void operator()(Handle handle, Packet const & packet); ///< Write \a packet to \a handle
+ /**< Write the complete \a packet as a datagram to \a
+ handle.
+ \param[in] handle Handle to write data to
+ \param[in] packet Packet to write */
+
+ private:
+ typename Handle::Address target_;
+ };
+
class IPv4SourceForcingDgramWriter : ConnectedDgramWriter
{
public:
void destination(senf::INet4SocketAddress & dest);
senf::INet4SocketAddress destination();
- void operator()(Handle handle, Packet packet);
+ void operator()(Handle handle, Packet const & packet);
///< Write \a packet to \a handle
/**< Write the complete \a packet as a datagram to \a
handle.
senf::INet4Address source_;
senf::INet4Address destination_;
unsigned int protocolId_;
-};
+ };
class IPv6SourceForcingDgramWriter : ConnectedDgramWriter
{
void destination(senf::INet6SocketAddress & dest);
senf::INet6SocketAddress destination();
- void operator()(Handle handle, Packet packet);
+ void operator()(Handle handle, Packet const & packet);
///< Write \a packet to \a handle
/**< Write the complete \a packet as a datagram to \a
handle.
connector::ActiveInput<> input; ///< Input connector from which data is received
- ActiveSocketSink(Handle handle); ///< Create new writer for the given handle
+ ActiveSocketSink(); ///< Create non-connected writer
+ /**< The writer will be disabled until a socket is set
+ \pre Requires \a Writer to be default constructible */
+ explicit ActiveSocketSink(Writer const & writer);
+ ///< Create non-connected writer
+ /**< The writer will be disabled until a socket is set
+ \pre Requires \a Writer to be copy constructible
+ \param[in] writer Writer helper writing packet date to
+ the socket */
+ explicit ActiveSocketSink(Handle handle); ///< Create new writer for the given handle
/**< Data will be written to \a handle using \a Writer.
\pre Requires \a Writer to be default constructible
\param[in] handle Handle to write data to */
/**< Data will be written to \a handle using \a Writer.
\pre Requires \a Writer to be copy constructible
\param[in] handle Handle to write data to
- \param[in] writer Writer helper writing packet date to the
- socket */
+ \param[in] writer Writer helper writing packet date to
+ the socket */
+
+ Writer & writer(); ///< Access the Writer
+ Handle handle(); ///< Access handle
+ void handle(Handle handle); ///< Set handle
+ /**< Assigning an empty or in-valid() handle will disable
+ the module until a new. valid handle is assigned. */
- Writer & writer(); ///< Access the Writer
private:
void write();
connector::PassiveInput<> input; ///< Input connector from which data is received
- PassiveSocketSink(Handle handle); ///< Create new writer for the given handle
+ PassiveSocketSink(); ///< Create non-connected writer
+ /**< The writer will be disabled until a socket is set
+ \pre Requires \a Writer to be default constructible */
+ explicit PassiveSocketSink(Writer const & writer);
+ ///< Create non-connected writer
+ /**< The writer will be disabled until a socket is set
+ \pre Requires \a Writer to be copy constructible
+ \param[in] writer Writer helper writing packet date to
+ the socket */
+ explicit PassiveSocketSink(Handle handle); ///< Create new writer for the given handle
/**< Data will be written to \a handle using \a Writer.
\pre Requires \a Writer to be default constructible
\param[in] handle Handle to write data to */
///< Create new writer for the given handle
/**< Data will be written to \a handle using \a Writer.
\pre Requires \a Writer to be copy constructible
- \param[in] handle Handle to write data to */
+ \param[in] handle Handle to write data to
+ \param[in] writer Writer helper writing packet date to
+ the socket */
+
+ Writer & writer(); ///< Access the Writer
+ Handle & handle(); ///< Access handle
+ void handle(Handle handle); ///< Set handle
+ /**< Assigning an empty or in-valid() handle will disable
+ the module until a new. valid handle is assigned. */
- Writer & writer(); ///< Access the Writer
- Handle & handle(); /**< Access the handle. This is intendet to be mainly used to reconnect
- the underlying socket. */
- /* void reconnect(senf::SocketAddress newAddress);
- ///< Reconnect the handle to which the packets are written
- */
+#ifndef DOXYGEN
void replaceHandle(Handle newHandle);
- /**< Replace the handle to which the packets are written
- * Normally you should access the handle and call connect with
- * the new address. This also works for other
- * (active) ConnectedSocketSinks/Sources */
+#endif
private:
void write();
+ void checkThrottle();
Handle handle_;
Writer writer_;