![]() |
TSDuck v3.44-4659
MPEG Transport Stream Toolkit
|
#include <tsUDPSocket.h>


Public Types | |
| using | SuperClass = Socket |
| Reference to the superclass. | |
| enum class | TimeStampType { NONE , SOFTWARE , HARDWARE } |
| Type of timestamp which is returned by receive(). More... | |
Public Member Functions | |
| UDPSocket (Report *report=nullptr, bool auto_open=false, IP gen=IP::Any, bool non_blocking=false) | |
| Constructor. | |
| UDPSocket (ReporterBase *delegate, bool auto_open=false, IP gen=IP::Any, bool non_blocking=false) | |
| Constructor. | |
| virtual | ~UDPSocket () override |
| Destructor. | |
| bool | addMembership (const IPAddress &multicast, const IPAddress &local, const IPAddress &source=IPAddress()) |
| Join a multicast group. | |
| bool | addMembership (const IPAddress &multicast, int interface_index, const IPAddress &source=IPAddress()) |
| Join a multicast group. | |
| bool | addMembershipAll (const IPAddress &multicast, const IPAddress &source=IPAddress(), bool link_local=true) |
| Join a multicast group. | |
| bool | addMembershipDefault (const IPAddress &multicast, const IPAddress &source=IPAddress()) |
| Join a multicast group. | |
| 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. | |
| bool | dropMembership () |
| Drop all multicast membership requests, including source-specific multicast. | |
| IP | generation () const |
| Get the IP generation with which the socket was open. | |
| IPSocketAddress | getDefaultDestination () const |
| Get the default destination address and port for outgoing messages. | |
| bool | getLocalAddress (IPSocketAddress &addr) const |
| Get local socket address. | |
| bool | getReceiveStatus (IOSB *iosb, IPSocketAddress &sender, IPSocketAddress &destination, cn::microseconds *timestamp=nullptr, TimeStampType *timestamp_type=nullptr) const |
| Get the result of an asynchronous receive(). | |
| SysSocketType | getSocket () const |
| Get the underlying socket device handle (use with care). | |
| 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. | |
| virtual bool | receive (void *data, size_t max_size, size_t &ret_size, IPSocketAddress &sender, IPSocketAddress &destination, const AbortInterface *abort=nullptr, cn::microseconds *timestamp=nullptr, TimeStampType *timestamp_type=nullptr, IOSB *iosb=nullptr) |
| Receive a message. | |
| 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, const IPSocketAddress &destination, IOSB *iosb=nullptr) |
| Send a message to a destination address and port. | |
| virtual bool | send (const void *data, size_t size, IOSB *iosb=nullptr) |
| Send a message to the default destination address and port. | |
| bool | setBroadcast (bool on) |
| Enable or disable the broadcast option. | |
| bool | setBroadcastIfRequired (const IPAddress destination) |
| Enable or disable the broadcast option, based on an IP address. | |
| bool | setDefaultDestination (const IPSocketAddress &addr) |
| Set a default destination address and port for outgoing messages. | |
| bool | setDefaultDestination (const UString &name) |
| Set a default destination address and port for outgoing messages. | |
| bool | setMulticastLoop (bool on) |
| Set the multicast loop option. | |
| bool | setNonBlocking (bool non_blocking) |
| Set the device in non-blocking mode. | |
| bool | setOutgoingMulticast (const IPAddress &addr) |
| Set the outgoing local interface for multicast messages. | |
| bool | setOutgoingMulticast (const UString &name) |
| Set the outgoing local interface for multicast messages. | |
| bool | setReceiveBufferSize (size_t size) |
| Set the receive buffer size. | |
| bool | setReceiveTimeout (cn::milliseconds timeout) |
| Set the receive timeout. | |
| bool | setReceiveTimestamps (bool on) |
| Enable or disable the generation of receive timestamps. | |
| 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 | setTOS (int tos) |
| Set the Type Of Service (TOS) or Traffic Class (IPv6) option. | |
| bool | setTTL (int ttl) |
| Set the Time To Live (TTL) option. | |
| bool | setTTL (int ttl, bool multicast) |
| 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) |
| Set an open socket descriptor from a subclass. | |
| bool | setSystemNonBlocking (SysSocketType fd, bool non_blocking) |
| Convenience method to set a system file descriptor or socket handle in non-blocking mode. | |
UDP Socket.
|
strong |
Type of timestamp which is returned by receive().
| Enumerator | |
|---|---|
| NONE | No timestamp. |
| SOFTWARE | Software time stamp, generated by the kernel. |
| HARDWARE | Hardware time stamp, generated by the NIC, when supported. |
|
explicit |
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] | auto_open | If true, call open() immediately. |
| [in] | gen | IP generation, IPv4 or IPv6. If set to IP::Any, this socket can receive IPv4 and IPv6 datagrams. If gen is IP::v6, the socket is created with option IPV6_V6ONLY set. |
| [in] | non_blocking | It true, the device is initially set in non-blocking mode. |
|
explicit |
Constructor.
| [in] | delegate | Use the report of another ReporterBase. If delegate is null, log messages are discarded. |
| [in] | auto_open | If true, call open() immediately. |
| [in] | gen | IP generation, IPv4 or IPv6. If set to IP::Any, this socket can receive IPv4 and IPv6 datagrams. If gen is IP::v6, the socket is created with option IPV6_V6ONLY set. |
| [in] | non_blocking | It true, the device is initially set in non-blocking mode. |
| bool ts::UDPSocket::setDefaultDestination | ( | const IPSocketAddress & | addr | ) |
Set a default destination address and port for outgoing messages.
There are two versions of the send() method. One of them explicitly specifies the destination of the packet to send. The second version does not specify a destination; the packet is sent to the default destination.
| [in] | addr | Socket address of the destination. Both address and port are mandatory in the socket address, they cannot be set to IPAddress::AnyAddress4 or IPSocketAddress::AnyPort. |
| bool ts::UDPSocket::setDefaultDestination | ( | const UString & | name | ) |
Set a default destination address and port for outgoing messages.
There are two versions of the send() method. One of them explicitly specifies the destination of the packet to send. The second version does not specify a destination; the packet is sent to the default destination.
| [in] | name | A string describing the socket address of the destination. See IPSocketAddress::resolve() for a description of the expected string format. |
|
inline |
Get the default destination address and port for outgoing messages.
| bool ts::UDPSocket::setOutgoingMulticast | ( | const IPAddress & | addr | ) |
Set the outgoing local interface for multicast messages.
| [in] | addr | IP address of a local interface. |
| bool ts::UDPSocket::setOutgoingMulticast | ( | const UString & | name | ) |
Set the outgoing local interface for multicast messages.
| [in] | name | A string describing the IP address of a local interface. See IPAddress::resolve() for a description of the expected string format. |
| bool ts::UDPSocket::setTTL | ( | int | ttl, |
| bool | multicast | ||
| ) |
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] | multicast | When true, set the multicast TTL option. When false, set the unicast TTL option. |
|
inline |
Set the Time To Live (TTL) option.
If the default destination is a multicast address, set the multicast TTL option. Otherwise, set the unicast TTL option.
| [in] | ttl | The TTL value, ie. the maximum number of "hops" between routers before an IP packet is dropped. |
| bool ts::UDPSocket::setTOS | ( | int | tos | ) |
Set the Type Of Service (TOS) or Traffic Class (IPv6) option.
The interpretation of the tos parameter depends in the IP generation. With IPv4, this is a "type of service" value. With IPv6, this is a "traffic class" value.
Note that correct support for this option depends on the operating system. Typically, it never worked correctly on Windows.
| [in] | tos | The type of service (IPv4) or traffic class (IPv6) value. |
| bool ts::UDPSocket::setMulticastLoop | ( | bool | on | ) |
Set the multicast loop option.
By default, the multicast packets are looped back on local interfaces. Use this to disable multicast loopback.
| [in] | on | It true, multicast loopback is on. When false, it is off. |
| bool ts::UDPSocket::setReceiveTimestamps | ( | bool | on | ) |
Enable or disable the generation of receive timestamps.
When enabled, each received UDP packets comes with a time stamp (see receive()). When possible, a hardware timestamp from the NIC is received. Otherwise, a software timestamp is generated by the kernel.
When enabled, this option is a request, not a requirement. This option is supported on Linux and macOS only. It is ignored on other systems.
| [in] | on | If true, receive timestamps are activated on the socket. Otherwise, they are disabled. |
| bool ts::UDPSocket::setBroadcast | ( | bool | on | ) |
Enable or disable the broadcast option.
| [in] | on | If true, broadcast is activated on the socket. Otherwise, it is disabled. |
| bool ts::UDPSocket::setBroadcastIfRequired | ( | const IPAddress | destination | ) |
Enable or disable the broadcast option, based on an IP address.
| [in] | destination | An hypothetical destination address. If this address is the broadcast address of a local interface, the broadcast option is set. Otherwise, the broadcast option is unchanged. |
|
inline |
Join a multicast group.
This method indicates that the application wishes to receive multicast packets which are sent to a specific multicast address. Specifying a non-default source address, source-specific multicast (SSM) is used. Note that source-specific multicast exists on IPv4 only.
| [in] | multicast | Multicast IP address to listen to. |
| [in] | local | IP address of a local interface on which to listen. If set to IPAddress::AnyAddress4, the application lets the system selects the appropriate local interface. |
| [in] | source | Source address for SSM. Ignored on IPv6 socket. |
|
inline |
Join a multicast group.
This method indicates that the application wishes to receive multicast packets which are sent to a specific multicast address. Specifying a non-default source address, source-specific multicast (SSM) is used. Note that source-specific multicast exists on IPv4 only.
| [in] | multicast | Multicast IP address to listen to. |
| [in] | interface_index | Index of a local interface on which to listen. If set to zero, the application lets the system selects the appropriate local interface. |
| [in] | source | Source address for SSM. Ignored on IPv6 socket. |
| bool ts::UDPSocket::addMembershipAll | ( | const IPAddress & | multicast, |
| const IPAddress & | source = IPAddress(), |
||
| bool | link_local = true |
||
| ) |
Join a multicast group.
This method indicates that the application wishes to receive multicast packets which are sent to a specific multicast address. Specifying a non-default source address, source-specific multicast (SSM) is used.
Using this method, the application listens on all local interfaces.
| [in] | multicast | Multicast IP address to listen to. |
| [in] | source | Source address for SSM. |
| [in] | link_local | If true, also add membership on link-local addresses, otherwise ignore them. |
|
inline |
Join a multicast group.
This method indicates that the application wishes to receive multicast packets which are sent to a specific multicast address. Specifying a non-default source address, source-specific multicast (SSM) is used.
Using this method, the application lets the system selects the appropriate local interface.
| [in] | multicast | Multicast IP address to listen to. |
| [in] | source | Source address for SSM. |
| bool ts::UDPSocket::dropMembership | ( | ) |
Drop all multicast membership requests, including source-specific multicast.
|
virtual |
Send a message to a destination address and port.
| [in] | data | Address of the message to send. |
| [in] | size | Size in bytes of the message to send. |
| [in] | destination | Socket address of the destination. Both address and port are mandatory in the socket address, they cannot be set to IPAddress::AnyAddress4 or IPSocketAddress::AnyPort. |
| [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. |
|
virtual |
Send a message to the default destination address and port.
| [in] | data | Address of the message to send. |
| [in] | size | Size in bytes of the message 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. |
|
virtual |
Receive a message.
| [out] | data | Address of the buffer for the received message. |
| [in] | max_size | Size in bytes of the reception buffer. |
| [out] | ret_size | Size in bytes of the received message. Will never be larger than max_size. |
| [out] | sender | Socket address of the sender. |
| [out] | destination | Socket address of the packet destination. Can be useful to check in multicast packets. |
| [in] | abort | If non-zero, invoked when I/O is interrupted (in case of user-interrupt, return, otherwise retry). |
| [out] | timestamp | When not null, return the receive timestamp in micro-seconds. Use setReceiveTimestamps() to enable the generation of receive timestamps. If the returned value is negative, no timestamp is available. |
| [out] | timestamp_type | When not null, return the type of receive timestamp. |
| [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::UDPReceiver.
| bool ts::UDPSocket::getReceiveStatus | ( | IOSB * | iosb, |
| IPSocketAddress & | sender, | ||
| IPSocketAddress & | destination, | ||
| cn::microseconds * | timestamp = nullptr, |
||
| TimeStampType * | timestamp_type = nullptr |
||
| ) | const |
Get the result of an asynchronous receive().
This method shall be used with asynchronous I/O only. It returns an error when the system uses non-blocking I/O instead of asynchronous I/O.
| [in,out] | iosb | Address of the IOSB structure which was used when receive() was called. |
| [out] | sender | Socket address of the sender. |
| [out] | destination | Socket address of the packet destination. Can be useful to check in multicast packets. |
| [out] | timestamp | When not null, return the receive timestamp in micro-seconds. Use setReceiveTimestamps() to enable the generation of receive timestamps. If the returned value is negative, no timestamp is available. |
| [out] | timestamp_type | When not null, return the type of receive timestamp. |
|
overridevirtual |
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.
Reimplemented in ts::UDPReceiver.
|
overridevirtual |
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.
|
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 |
|
protectedvirtualinherited |
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 in ts::TCPSocket.
|
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. |