All notable changes to this project will be documented in this file.
The format is based on CHANGELOG.md and this project adheres to Semantic Versioning.
This release is focused on addressing the performance issues caused by multicast_expert rescanning the network interfaces on the machine each time a socket is opened. You can now avoid this overhead by using the new scan functions and then passing their result into the socket constructors' iface
argument.
multicast_expert.scan_interfaces()
provides a more complete wrapper aroundnetifaces
It will scan all the interface details from the machine into a list ofIfaceInfo
dataclass objects.multicast_expert.find_interfaces()
provides an easy way to locate interfaces matching a given specifier. The specifier may be an IPv4 or IPv6 address of the interface (as a string or an object), or an interface name (e.g. eth0).
McastTxSocket
andMcastRxSocket
now accept anIfaceSpecifier
for their interface IP arguments instead of just an IP address string. This is compatible with old usage but allows a wider range of values to be used, including an interface obtained fromscan_interfaces()
orfind_interfaces()
.McastTxSocket
andMcastRxSocket
now accept IPv4Address and IPv6Address objects in addition to strings for themcast_ips
andsource_ips
constructor arguments.- Note that the sendto() and recvfrom() functions still accept and return only string addresses, as this matches the behavior of the
socket
module (surprisingly).
- Note that the sendto() and recvfrom() functions still accept and return only string addresses, as this matches the behavior of the
- It is now possible to unambiguously open a socket on an interface that has the same IP as another interface (in most cases). Previously, it was undefined which interface you'd get if this happened.
- It is now possible to open a
McastRxSocket
socket on a machine with interfaces with multiple IPs. This previously crashed unless you explicitly specified one interface to use.
- Fix mypy and pylance "name not exported" error visible for users of the library
- Linting (via ruff, pyright, and docsig in addition to the preexisting mypy) and autoformatting (via ruff) has been added to the project
- New release workflow via Trusted Publishing
- Add FAQ entry about IGMP Querier mode in README
- multicast_expert now has Github Actions CI thanks to Victor Tang's contribution! It is now automatically tested on Mac, Linux, and Windows.
- Add
enable_external_loopback
option on tx and rx sockets, which can be used to turn on multicast loopback for non-loopback interfaces. Note that this option has to be set on both the Tx and Rx sockets in order to work correctly on all platforms.
- Fix bug which prevented opening IPv6 multicast Tx sockets on Linux in some situations.
- Fix mypy type checker error on non-Windows platforms due to use of ctypes Windows functionality.
- Fix the type annotation for McastRxSocket.settimeout() parameter.
- Replace
blocking
arg to McastRxSocket withtimeout
, which allows you to set an integer timeout in the constructor. The old argument is still supported but is marked as legacy.
- Fix some mypy errors that were visible for users of the library.
- Fix IPv6 McastRxSocket being broken on Linux when multiple interfaces were used (need to open an OS socket for each interface ip-mcast ip permutation)
- An McastRxSocket can now listen on multiple interface IPs at once via passing a list of interface addresses to the new
iface_ips
parameter. The oldiface_ip
parameter is retained for compatibility. - If no interface IPs are specified, McastRxSocket now listens on all non-loopback interfaces instead of just the default gateway. This should provide more intuitive default behavior for applications where the interface for receiving isn't known.
- Type annotations now applied to everything, library passes mypy in strict mode.
- py.typed file now provided so that mypy can see type annotations provided by multicast_expert in your own projects.
- Another hotfix for a typo in v1.1.0
- Hotfix for a missing import in v1.1.0. Forgot to run unit tests one last time before uploading to pypi 🤦♂️
- Add mac compatibility (now that I finally have someone to help test who possesses a mac). Previously only Windows and Linux were properly supported.
Documentation updates
Initial Release