TSDuck v3.40-4001
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 ()=default | |
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 | getLocalAddress (IPSocketAddress &addr, Report &report=(ts::CerrReport::Instance())) |
Get local socket address. | |
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 (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 void *data, size_t size, Report &report=(ts::CerrReport::Instance())) |
Send data. | |
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. | |
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 &report=(ts::CerrReport::Instance())) |
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. | |
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.
bool ts::TCPConnection::connect | ( | const IPSocketAddress & | addr, |
Report & | report = (ts::CerrReport::Instance()) |
||
) |
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. |
|
inline |
Check if the socket is connected.
bool ts::TCPConnection::getPeer | ( | IPSocketAddress & | addr, |
Report & | report = (ts::CerrReport::Instance()) |
||
) | const |
Get the connected remote peer.
[out] | addr | IP address and port of the remote socket. |
[in,out] | report | Where to report error. |
UString ts::TCPConnection::peerName | ( | ) | const |
Get the connected remote peer as a string.
bool ts::TCPConnection::closeWriter | ( | Report & | report = (ts::CerrReport::Instance()) | ) |
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. |
bool ts::TCPConnection::disconnect | ( | Report & | report = (ts::CerrReport::Instance()) | ) |
Disconnect from remote partner.
[in,out] | report | Where to report error. |
bool ts::TCPConnection::send | ( | const void * | data, |
size_t | size, | ||
Report & | report = (ts::CerrReport::Instance()) |
||
) |
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. |
bool ts::TCPConnection::receive | ( | void * | buffer, |
size_t | max_size, | ||
size_t & | ret_size, | ||
const AbortInterface * | abort = nullptr , |
||
Report & | report = (ts::CerrReport::Instance()) |
||
) |
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. |
bool ts::TCPConnection::receive | ( | void * | buffer, |
size_t | size, | ||
const AbortInterface * | abort = nullptr , |
||
Report & | report = (ts::CerrReport::Instance()) |
||
) |
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. |
|
protectedvirtual |
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 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.
[in,out] | report | Where to report error. |
|
overrideprotectedvirtual |
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 (IPv4 connections allowed). |
[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. |