![]() |
TSDuck v3.44-4659
MPEG Transport Stream Toolkit
|
Base class for a TCP/IP session. More...
#include <tsTCPConnection.h>


Public Types | |
| using | SuperClass = TCPSocket |
| Reference to the superclass. | |
Public Member Functions | |
| TCPConnection (Report *report=nullptr, bool non_blocking=false) | |
| Constructor. | |
| TCPConnection (ReporterBase *delegate, bool non_blocking=false) | |
| Constructor. | |
| void | addSubscription (SocketHandlerInterface *handler) |
| Add a subscriber to open/close events. | |
| bool | bind (const IPSocketAddress &addr) |
| Bind to a local address and port. | |
| void | cancelSubscription (SocketHandlerInterface *handler) |
| Remove a subscriber to open/close events. | |
| virtual bool | close (bool silent=false) override |
| Close the socket. | |
| virtual bool | closeWriter (bool silent=false) |
| Close the write direction of the connection. | |
| virtual bool | connect (const IPSocketAddress &addr, IOSB *iosb=nullptr) |
| Connect to a remote address and port. | |
| virtual bool | disconnect (bool silent=false) |
| Disconnect from remote partner. | |
| IP | generation () const |
| Get the IP generation with which the socket was open. | |
| bool | getLocalAddress (IPSocketAddress &addr) const |
| Get local socket address. | |
| bool | getPeer (IPSocketAddress &addr) |
| 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 | isNonBlocking () const |
| Check if the device is in non-blocking mode. | |
| bool | isOpen () const |
| Check if socket is open. | |
| bool | muteReport (bool mute) |
| Temporarily mute the associated report. | |
| virtual bool | open (IP gen) override |
| Open the socket. | |
| UString | peerName () |
| Get the connected remote peer as a string. | |
| virtual bool | receive (void *buffer, size_t max_size, size_t &ret_size, const AbortInterface *abort=nullptr, IOSB *iosb=nullptr) |
| Receive data. | |
| virtual bool | receive (void *buffer, size_t size, const AbortInterface *abort=nullptr) |
| Receive data until buffer is full. | |
| Report & | report () const |
| Access the Report which is associated with this object. | |
| bool | reusePort (bool reuse_port) |
| Set the "reuse port" option. | |
| virtual bool | send (const void *data, size_t size, IOSB *iosb=nullptr) |
| Send data. | |
| bool | setKeepAlive (bool active) |
| Set the "keep alive" option. | |
| bool | setLingerTime (int seconds) |
| Set the linger time option. | |
| bool | setNoDelay (bool active) |
| Set the "no delay" option. | |
| bool | setNoLinger () |
| Remove the linger time option. | |
| bool | setNonBlocking (bool non_blocking) |
| Set the device in non-blocking mode. | |
| bool | setReceiveBufferSize (size_t size) |
| Set the receive buffer size. | |
| bool | setReceiveTimeout (cn::milliseconds timeout) |
| Set the receive timeout. | |
| Report * | setReport (Report *report) |
| Associate this object with another Report to log errors. | |
| ReporterBase * | setReport (ReporterBase *delegate) |
| Associate this object with another ReporterBase to log errors. | |
| bool | setSendBufferSize (size_t size) |
| Set the send buffer size. | |
| bool | setTTL (int ttl) |
| Set the Time To Live (TTL) option. | |
Static Public Member Functions | |
| static int | SilentLevel (bool silent) |
| Compute a log severity level from a "silent" parameter. | |
Protected Member Functions | |
| virtual bool | allowSetNonBlocking () const override |
| Check that the non-blocking mode can be set. | |
| bool | checkNonBlocking (bool non_blocking, const UChar *opname) |
| Check the blocking mode of a device. | |
| bool | checkNonBlocking (IOSB *iosb, const UChar *opname) |
| Check the blocking mode of a device. | |
| bool | convert (IPAddress &addr) const |
| Convert an IP address to make it compatible with the socket IP generation. | |
| bool | createSocket (IP gen, int type, int protocol) |
| Create the socket. | |
| virtual void | declareOpened (SysSocketType sock) override |
| Set an open socket descriptor from a subclass. | |
| virtual void | handleClosed () override |
| This virtual method can be overriden by subclasses to be notified of close. | |
| virtual void | handleConnected () |
| This virtual method can be overriden by subclasses to be notified of connection. | |
| virtual void | handleDisconnected () |
| This virtual method can be overriden by subclasses to be notified of disconnection. | |
| virtual void | handleOpened () |
| This virtual method can be overriden by subclasses to be notified of open. | |
| bool | setSystemNonBlocking (SysSocketType fd, bool non_blocking) |
| Convenience method to set a system file descriptor or socket handle in non-blocking mode. | |
Protected Attributes | |
| std::recursive_mutex | _mutex {} |
| Mutex protecting this object. | |
Base class for a TCP/IP session.
This class can be used directly by applications or can be derived to create specific sub-classes which handle application protocols.
This class is used in two contexts:
For a detailed scenario of the server side, see the class TCPServer.
The following lists the typical client-side scenario in the correct order. Many steps such as setting socket options are optional. The symbol [*] means mandatory. Depending on the platform, some options settings are sensitive to the order. The following order has proven to work on most platforms.
Invoking close() is optional since the destructor of the class will properly close the socket if not already done. Invoking disconnect() is also optional but is highly recommended. Closing a socket without prior disconnect is considered as a session abort by the remote peer. The peer may thus consider that something went wrong may take unexpected corrective or rollback actions.
|
inlineexplicit |
Constructor.
| [in] | report | Where to report errors. The report object must remain valid as long as this object exists or setReport() is used with another Report object. If report is null, log messages are discarded. |
| [in] | non_blocking | It true, the device is initially set in non-blocking mode. |
|
inlineexplicit |
Constructor.
| [in] | delegate | Use the report of another ReporterBase. If delegate is null, log messages are discarded. |
| [in] | non_blocking | It true, the device is initially set in non-blocking mode. |
|
virtual |
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] | iosb | Address of an IOSB structure. If non-null, the socket must be in non-blocking mode. When null, the socket must be in blocking mode (the default). See the description of IOSB. Important: The parameter iosb should not be used by applications. It should be used only by "reactive classes", which work in combination with a Reactor. |
Reimplemented in ts::TLSConnection.
|
inline |
Check if the socket is connected.
| bool ts::TCPConnection::getPeer | ( | IPSocketAddress & | addr | ) |
Get the connected remote peer.
| [out] | addr | IP address and port of the remote socket. |
| UString ts::TCPConnection::peerName | ( | ) |
Get the connected remote peer as a string.
|
virtual |
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] | silent | If true, do not report errors through the logger. This is typically useful when the socket is in some error condition and closing it is necessary although it may generate additional meaningless errors. |
Reimplemented in ts::TLSConnection.
|
virtual |
Disconnect from remote partner.
| [in] | silent | If true, do not report errors through the logger. This is typically useful when the socket is in some error condition and closing it is necessary although it may generate additional meaningless errors. |
Reimplemented in ts::TLSConnection.
|
virtual |
Send data.
| [in] | data | Address of the data to send. |
| [in] | size | Size in bytes of the data to send. |
| [in,out] | iosb | Address of an IOSB structure. If non-null, the socket must be in non-blocking mode. When null, the socket must be in blocking mode (the default). See the description of IOSB. Important: The parameter iosb should not be used by applications. It should be used only by "reactive classes", which work in combination with a Reactor. |
Reimplemented in ts::TLSConnection.
|
virtual |
Receive data.
This version of receiveMessage() 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] | iosb | Address of an IOSB structure. If non-null, the socket must be in non-blocking mode. When null, the socket must be in blocking mode (the default). See the description of IOSB. Important: The parameter iosb should not be used by applications. It should be used only by "reactive classes", which work in combination with a Reactor. |
Reimplemented in ts::TLSConnection.
|
virtual |
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. If some data, but not all, were received before the connection was closed, these data are ignored and the method returns false. The version is typically useful when the application knows that a certain amount of data is expected and must wait for them.
This method is only allowed when the socket is in blocking-mode (the default) because this method is blocking by definition. Therefore, there is no iosb parameter.
This base implementation uses the variable-length version of receive(). Therefore, a subclass may only override the variable-length version and not this one.
| [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). |
Reimplemented in ts::TLSConnection.
|
protectedvirtual |
This virtual method can be overriden by subclasses to be notified of connection.
All subclasses should explicitly invoke their superclass' handlers.
Reimplemented in ts::tlv::Connection< SAFETY >, ts::tlv::Connection< ThreadSafety::Full >, and ts::tlv::Connection< ThreadSafety::None >.
|
protectedvirtual |
This virtual method can be overriden by subclasses to be notified of disconnection.
All subclasses should explicitly invoke their superclass' handlers.
|
overrideprotectedvirtual |
This virtual method can be overriden by subclasses to be notified of close.
All subclasses should explicitly invoke their superclass' handlers.
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. |
|
inherited |
Remove the linger time option.
|
inherited |
Set the linger time option.
| [in] | seconds | Number of seconds to wait after shuting down the socket. |
|
inherited |
Set the "keep alive" option.
| [in] | active | If true, the socket periodically sends "keep alive" packets when the connection is idle. |
|
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. |
|
overridevirtualinherited |
Open the socket.
| [in] | gen | IP generation, IPv4 or IPv6. If set to IP::Any, open an IPv6 socket (IPv4 connections allowed). |
Implements ts::Socket.
|
overridevirtualinherited |
Close the socket.
If overridden by a subclass, the superclass must be called at the end of the overridden close().
| [in] | silent | If true, do not report errors through the logger. This is typically useful when the socket is in some error condition and closing it is necessary although it may generate additional meaningless errors. |
Reimplemented from ts::Socket.
Reimplemented in ts::TCPServer, and ts::TLSServer.
|
protectedvirtualinherited |
This virtual method can be overriden by subclasses to be notified of open.
All subclasses should explicitly invoke their superclass' handlers.
|
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. |
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. |
|
inherited |
Set the receive buffer size.
| [in] | size | Receive buffer size in bytes. |
|
inherited |
Set the receive timeout.
| [in] | timeout | Receive timeout in milliseconds. If negative or zero, receive timeout is not used, reception waits forever. |
|
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. |
|
inherited |
Bind to a local address and port.
The IP address part of the socket address must one of:
Special note for receiving multicast on most Unix systems (at least Linux and macOS): The IP address shall be either AnyAddress4 or the multicast group address. Do not specify a local address to receive multicast on Unix.
The port number part of the socket address must be one of:
| [in] | addr | Local socket address to bind to. |
|
inherited |
Get local socket address.
| [out] | addr | Local socket address of the connection. |
|
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.
|
inherited |
|
inherited |
|
protectedinherited |
|
protectedinherited |
Convert an IP address to make it compatible with the socket IP generation.
| addr | [in,out] The address to convert. |
|
overrideprotectedvirtualinherited |
Check that the non-blocking mode can be set.
Must be implemented by subclasses which do not support setting the non-blocking in certain states, such as after being opened. The default implementation always allows setting the non-blocking mode.
Reimplemented from ts::NonBlockingDevice.
|
inherited |
Set the device in non-blocking mode.
Important: Usually, this method must be called before opening the device, whatever it means. Otherwise it is ignored and the device blocking mode is unchanged.
| [in] | non_blocking | It true, the device is set in non-blocking mode. |
|
inlineinherited |
Check if the device is in non-blocking mode.
|
protectedinherited |
Check the blocking mode of a device.
Called by subclass methods which are explicitly called in blocking or non-blocking mode.
| [in] | non_blocking | The required non-blocking mode. |
| [in] | opname | Name of the operation, for the error message. |
|
protectedinherited |
Check the blocking mode of a device.
Called by subclass methods which are explicitly called in blocking or non-blocking mode.
| [in,out] | iosb | Address of an IOSB structure. If non-null, we are in non-blocking mode. When null, we are in blocking mode. When non-null, pending is reset to false and overlap is zeroed. |
| [in] | opname | Name of the operation, for the error message. |
|
protectedinherited |
Convenience method to set a system file descriptor or socket handle in non-blocking mode.
| [in] | fd | System file descriptor (UNIX) or socket handle (Windows). On Windows, non-socket devices shall be opened with flag FILE_FLAG_OVERLAPPED instead of using this method. |
| [in] | non_blocking | It true, the device is set in non-blocking mode. |
|
inherited |
Associate this object with another Report to log errors.
| [in] | report | Where to report errors. The report object must remain valid as long as this object exists or setReport() is used with another Report object. If report is null, log messages are discarded. |
|
inherited |
Associate this object with another ReporterBase to log errors.
| [in] | delegate | Use the report of another ReporterBase. If delegate is null, the previous explicit Report is used.. |
|
inherited |
Temporarily mute the associated report.
| [in] | mute | It true, report() will return a null report (log messages are discarded), until muteReport() is invoked again with mute set to false. |
|
inlinestaticinherited |
Compute a log severity level from a "silent" parameter.
Some subclass methods have a "silent" parameter to avoid reporting errors which may be insignificant, typically when closing a device after an error, in which case the close operation may produce other errors if the previous error left the device in an inconsistent state. While those errors should not be displayed as errors, we still display them at debug level.
| [in] | silent | If true, do not report errors, report debug messages instead. |