TSDuck v3.40-3968
MPEG Transport Stream Toolkit
|
TCP connection using TLV messages. More...
#include <tstlvConnection.h>
Public Types | |
using | MutexType = typename ThreadSafetyMutex< SAFETY >::type |
Generic definition of the mutex for this class. | |
using | SuperClass = ts::TCPConnection |
Reference to superclass. | |
Public Member Functions | |
Connection (const Protocol &protocol, bool auto_error_response=true, size_t max_invalid_msg=0) | |
Constructor. | |
bool | bind (const IPSocketAddress &addr, Report &report=(ts::CerrReport::Instance())) |
Bind to a local address and port. | |
virtual bool | close (Report &report=(ts::CerrReport::Instance())) override |
Close the socket. | |
bool | closeWriter (Report &report=(ts::CerrReport::Instance())) |
Close the write direction of the connection. | |
bool | connect (const IPSocketAddress &addr, Report &report=(ts::CerrReport::Instance())) |
Connect to a remote address and port. | |
bool | disconnect (Report &report=(ts::CerrReport::Instance())) |
Disconnect from remote partner. | |
IP | generation () const |
Get the IP generation with which the socket was open. | |
bool | getAutoErrorResponse () const |
Get invalid incoming messages processing. | |
bool | getLocalAddress (IPSocketAddress &addr, Report &report=(ts::CerrReport::Instance())) |
Get local socket address. | |
size_t | getMaxInvalidMessages () const |
Get invalid message threshold. | |
bool | getPeer (IPSocketAddress &addr, Report &report=(ts::CerrReport::Instance())) const |
Get the connected remote peer. | |
SysSocketType | getSocket () const |
Get the underlying socket device handle (use with care). | |
bool | isConnected () const |
Check if the socket is connected. | |
bool | isOpen () const |
Check if socket is open. | |
virtual bool | open (IP gen, Report &report=(ts::CerrReport::Instance())) override |
Open the socket. | |
UString | peerName () const |
Get the connected remote peer as a string. | |
bool | receive (MessagePtr &msg, const AbortInterface *abort, Logger &logger) |
Receive a TLV message. | |
bool | receive (MessagePtr &msg, const AbortInterface *abort, Report &report) |
Receive a TLV message. | |
bool | receive (void *buffer, size_t max_size, size_t &ret_size, const AbortInterface *abort=nullptr, Report &report=(ts::CerrReport::Instance())) |
Receive data. | |
bool | receive (void *buffer, size_t size, const AbortInterface *abort=nullptr, Report &report=(ts::CerrReport::Instance())) |
Receive data until buffer is full. | |
bool | reusePort (bool reuse_port, Report &report=(ts::CerrReport::Instance())) |
Set the "reuse port" option. | |
bool | send (const Message &msg, Logger &logger) |
Serialize and send a TLV message. | |
bool | send (const Message &msg, Report &report) |
Serialize and send a TLV message. | |
bool | send (const void *data, size_t size, Report &report=(ts::CerrReport::Instance())) |
Send data. | |
void | setAutoErrorResponse (bool on) |
Set invalid incoming messages processing. | |
bool | setKeepAlive (bool active, Report &report=(ts::CerrReport::Instance())) |
Set the "keep alive" option. | |
bool | setLingerTime (int seconds, Report &report=(ts::CerrReport::Instance())) |
Set the linger time option. | |
void | setMaxInvalidMessages (size_t n) |
Set invalid message threshold. | |
bool | setNoDelay (bool active, Report &report=(ts::CerrReport::Instance())) |
Set the "no delay" option. | |
bool | setNoLinger (Report &report=(ts::CerrReport::Instance())) |
Remove the linger time option. | |
bool | setReceiveBufferSize (size_t size, Report &report=(ts::CerrReport::Instance())) |
Set the receive buffer size. | |
bool | setReceiveTimeout (cn::milliseconds timeout, Report &report=(ts::CerrReport::Instance())) |
Set the receive timeout. | |
bool | setSendBufferSize (size_t size, Report &report=(ts::CerrReport::Instance())) |
Set the send buffer size. | |
bool | setTTL (int ttl, Report &report=(ts::CerrReport::Instance())) |
Set the Time To Live (TTL) option. | |
Protected Member Functions | |
bool | convert (IPAddress &addr, Report &report) const |
Convert an IP address to make it compatible with the socket IP generation. | |
bool | createSocket (IP gen, int type, int protocol, Report &report) |
Create the socket. | |
virtual void | declareOpened (SysSocketType sock, Report &report) override |
Set an open socket descriptor from a subclass. | |
virtual void | handleClosed (Report &report=(ts::CerrReport::Instance())) override |
This virtual method can be overriden by subclasses to be notified of close. | |
virtual void | handleConnected (Report &) override |
This virtual method can be overriden by subclasses to be notified of connection. | |
virtual void | handleDisconnected (Report &report=(ts::CerrReport::Instance())) |
This virtual method can be overriden by subclasses to be notified of disconnection. | |
virtual void | handleOpened (Report &report) |
This virtual method can be overriden by subclasses to be notified of open. | |
Protected Attributes | |
std::recursive_mutex | _mutex {} |
Mutex protecting this object. | |
TCP connection using TLV messages.
SAFETY | The required type of thread-safety. |
|
explicit |
Constructor.
[in] | protocol | The incoming messages are interpreted according to this protocol. The reference is kept in this object. |
[in] | auto_error_response | When an invalid message is received, the corresponding error message is automatically sent back to the sender when auto_error_response is true. |
[in] | max_invalid_msg | When non-zero, the connection is automatically disconnected when the number of consecutive invalid messages has reached this value. |
bool ts::tlv::Connection< SAFETY >::send | ( | const Message & | msg, |
Report & | report | ||
) |
Serialize and send a TLV message.
[in] | msg | The message to send. |
[in,out] | report | Where to report errors. |
bool ts::tlv::Connection< SAFETY >::send | ( | const Message & | msg, |
Logger & | logger | ||
) |
Serialize and send a TLV message.
[in] | msg | The message to send. |
[in,out] | logger | Where to report errors and messages. |
bool ts::tlv::Connection< SAFETY >::receive | ( | MessagePtr & | msg, |
const AbortInterface * | abort, | ||
Report & | report | ||
) |
Receive a TLV message.
Wait for the message, deserialize it and validate it. Process invalid messages and loop until a valid message is received.
[out] | msg | A safe pointer to the received message. |
[in] | abort | If non-zero, invoked when I/O is interrupted (in case of user-interrupt, return, otherwise retry). |
[in,out] | report | Where to report errors. |
bool ts::tlv::Connection< SAFETY >::receive | ( | MessagePtr & | msg, |
const AbortInterface * | abort, | ||
Logger & | logger | ||
) |
Receive a TLV message.
Wait for the message, deserialize it and validate it. Process invalid messages and loop until a valid message is received.
[out] | msg | A safe pointer to the received message. |
[in] | abort | If non-zero, invoked when I/O is interrupted (in case of user-interrupt, return, otherwise retry). |
[in,out] | logger | Where to report errors and messages. |
|
inline |
Get invalid incoming messages processing.
|
inline |
Set invalid incoming messages processing.
[in] | on | When an invalid message is received, the corresponding error message is automatically sent back to the sender when on is true. |
|
inline |
Get invalid message threshold.
|
inline |
Set invalid message threshold.
[in] | n | When non-zero, the connection is automatically disconnected when the number of consecutive invalid messages has reached this value. |
|
overrideprotectedvirtual |
This virtual method can be overriden by subclasses to be notified of connection.
All subclasses should explicitly invoke their superclass' handlers.
[in,out] | report | Where to report error. |
Reimplemented from ts::TCPConnection.
|
inherited |
Connect to a remote address and port.
Use this method when acting as TCP client. Do not use on server side: the TCPConnection object is passed to TCPServer::accept() which establishes the connection.
[in] | addr | IP address and port of the server to connect. |
[in,out] | report | Where to report error. |
|
inlineinherited |
Check if the socket is connected.
|
inherited |
Get the connected remote peer.
[out] | addr | IP address and port of the remote socket. |
[in,out] | report | Where to report error. |
|
inherited |
Get the connected remote peer as a string.
|
inherited |
Close the write direction of the connection.
The application shall call this routine after sending the last message but may still want to receive messages, waiting for the peer to voluntary disconnect.
[in,out] | report | Where to report error. |
|
inherited |
Disconnect from remote partner.
[in,out] | report | Where to report error. |
|
inherited |
Send data.
[in] | data | Address of the data to send. |
[in] | size | Size in bytes of the data to send. |
[in,out] | report | Where to report error. |
|
inherited |
Receive data.
This version of receive() returns when "some" data are received into the user buffer. The actual received data may be shorter than the user buffer size.
The version is typically useful when the application cannot predict how much data will be received and must respond even if the user buffer is not full.
[out] | buffer | Address of the buffer for the received data. |
[in] | max_size | Size in bytes of the reception buffer. |
[out] | ret_size | Size in bytes of the received data. Will never be larger than max_size. |
[in] | abort | If non-zero, invoked when I/O is interrupted (in case of user-interrupt, return, otherwise retry). |
[in,out] | report | Where to report error. |
|
inherited |
Receive data until buffer is full.
This version of receive() returns only when sufficient data are received to completely fill the user buffer. The size of the actual received data is identical to the user buffer size.
The version is typically useful when the application knows that a certain amount of data is expected and must wait for them.
[out] | buffer | Address of the buffer for the received data. |
[in] | size | Size in bytes of the buffer. |
[in] | abort | If non-zero, invoked when I/O is interrupted (in case of user-interrupt, return, otherwise retry). |
[in,out] | report | Where to report error. |
|
protectedvirtualinherited |
This virtual method can be overriden by subclasses to be notified of disconnection.
All subclasses should explicitly invoke their superclass' handlers.
[in,out] | report | Where to report error. |
|
overrideprotectedvirtualinherited |
This virtual method can be overriden by subclasses to be notified of close.
All subclasses should explicitly invoke their superclass' handlers.
[in,out] | report | Where to report error. |
Reimplemented from ts::TCPSocket.
|
inherited |
Set the Time To Live (TTL) option.
[in] | ttl | The TTL value, ie. the maximum number of "hops" between routers before an IP packet is dropped. |
[in,out] | report | Where to report error. |
|
inherited |
Remove the linger time option.
[in,out] | report | Where to report error. |
|
inherited |
Set the linger time option.
[in] | seconds | Number of seconds to wait after shuting down the socket. |
[in,out] | report | Where to report error. |
|
inherited |
Set the "keep alive" option.
[in] | active | If true, the socket periodically sends "keep alive" packets when the connection is idle. |
[in,out] | report | Where to report error. |
|
inherited |
Set the "no delay" option.
[in] | active | If true, the socket immediately sends outgoing packets. By default, a TCP socket waits a small amount of time after a send() operation to get a chance to group outgoing data from successive send() operations into one single packet. |
[in,out] | report | Where to report error. |
|
inherited |
Bind to a local address and port.
The IP address part of the socket address must one of:
The port number part of the socket address must be one of:
[in] | addr | Local socket address to bind to. |
[in,out] | report | Where to report error. |
|
overridevirtualinherited |
Open the socket.
[in] | gen | IP generation, IPv4 or IPv6. If set to IP::Any, open an IPv6 socket with option IPV6_V6ONLY cleared. As a server, this socket can accept IPv4 and IPv6 connections. If gen is IP::v6, the socket is created with option IPV6_V6ONLY set. |
[in,out] | report | Where to report error. |
Implements ts::Socket.
|
overridevirtualinherited |
Close the socket.
[in,out] | report | Where to report error. |
Reimplemented from ts::Socket.
Reimplemented in ts::TCPServer.
|
protectedvirtualinherited |
This virtual method can be overriden by subclasses to be notified of open.
All subclasses should explicitly invoke their superclass' handlers.
[in,out] | report | Where to report error. |
|
overrideprotectedvirtualinherited |
Set an open socket descriptor from a subclass.
This method is used by a server to declare that a client socket has just become opened.
[in] | sock | New socket descriptor. |
[in,out] | report | Where to report error. |
Reimplemented from ts::Socket.
|
inlineinherited |
Check if socket is open.
|
inlineinherited |
Get the IP generation with which the socket was open.
|
inherited |
Set the send buffer size.
[in] | size | Send buffer size in bytes. |
[in,out] | report | Where to report error. |
|
inherited |
Set the receive buffer size.
[in] | size | Receive buffer size in bytes. |
[in,out] | report | Where to report error. |
|
inherited |
Set the receive timeout.
[in] | timeout | Receive timeout in milliseconds. If negative, receive timeout is not used. |
[in,out] | report | Where to report error. |
|
inherited |
Set the "reuse port" option.
[in] | reuse_port | If true, the socket is allowed to reuse a local UDP port which is already bound. |
[in,out] | report | Where to report error. |
|
inherited |
Get local socket address.
[out] | addr | Local socket address of the connection. |
[in,out] | report | Where to report error. |
|
inlineinherited |
Get the underlying socket device handle (use with care).
This method is reserved for low-level operations and should not be used by normal applications.
Convert an IP address to make it compatible with the socket IP generation.
addr | [in,out] The address to convert. | |
[in,out] | report | Where to report error. |