/*! \file pibroadcast.h * \ingroup IO-Utils * \~\brief * \~english Broadcast for all interfaces, including loopback * \~russian Широкое вещание на все интерфейсы, включая loopback */ /* PIP - Platform Independent Primitives Broadcast for all interfaces, including loopback Ivan Pelipenko peri4ko@yandex.ru, Andrey Bychkov work.a.b@yandex.ru This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this program. If not, see . */ #ifndef PIBROADCAST_H #define PIBROADCAST_H #include "piethernet.h" #include "piethutilbase.h" #include "pip_io_utils_export.h" //! \~english Broadcast for all interfaces, including loopback //! \~russian Широкое вещание на все интерфейсы, включая loopback class PIP_IO_UTILS_EXPORT PIBroadcast : public PIThread , public PIEthUtilBase { PIOBJECT_SUBCLASS(PIBroadcast, PIThread); public: //! \~english %PIBroadcast channels, can be used independently //! \~russian Каналы %PIBroadcast, могут использоваться независимо enum Channel { Multicast /** Use multicast addresses */ = 0x01, Broadcast /** Use broadcast addresses */ = 0x02, Loopback /** Use loopback addresses */ = 0x04, All /** Use all channels */ = 0xFFFF, }; //! \~english Channels flags type //! \~russian Тип флагов каналов typedef PIFlags Channels; //! \~english Constructs %PIBroadcast. If "send_only" not set, all PIEthernets will be binded to receive data //! \~russian Создает %PIBroadcast. Если "send_only" не установлен, все PIEthernets будут привязаны для приема данных PIBroadcast(bool send_only = false); //! \~english Destructor //! \~russian Деструктор ~PIBroadcast(); //! \~english Set channels to "ch" and queue to reinit //! \~russian Установить каналы в "ch" и очередь на реинициализацию void setChannels(Channels ch); //! \~english Returns channels //! \~russian Возвращает каналы Channels channels() const { return _channels; } //! \~english Returns if is send_only //! \~russian Возвращает, является ли отправка только bool isSendOnly() const { return _send_only; } //! \~english Set multicast IP to "mg" and queue to reinit //! \~russian Установить multicast IP в "mg" и очередь на реинициализацию void setMulticastGroup(const PIString & mg); //! \~english Returns multicast IP //! \~russian Возвращает multicast IP PIString multicastGroup() const { return mcast_address.ipString(); } //! \~english Set multicast port to "port" and queue to reinit //! \~russian Установить multicast порт в "port" и очередь на реинициализацию void setMulticastPort(ushort port); //! \~english Returns multicast port //! \~russian Возвращает multicast порт ushort multicastPort() const { return mcast_address.port(); } //! \~english Set multicast address to "addr" and queue to reinit //! \~russian Установить multicast адрес в "addr" и очередь на реинициализацию void setMulticastAddress(const PINetworkAddress & addr); //! \~english Returns multicast address //! \~russian Возвращает multicast адрес PINetworkAddress multicastAddress() const { return mcast_address; } //! \~english Set broadcast port to "port" and queue to reinit //! \~russian Установить broadcast порт в "port" и очередь на реинициализацию void setBroadcastPort(ushort port); //! \~english Returns broadcast port //! \~russian Возвращает broadcast порт ushort broadcastPort() { return bcast_port; } //! \~english Set loopback start port to "port" and queue to reinit //! \~russian Установить начальный loopback порт в "port" и очередь на реинициализацию void setLoopbackPort(ushort port); //! \~english Returns loopback start port //! \~russian Возвращает начальный loopback порт ushort loopbackPort() { return lo_port; } //! \~english Set loopback ports count to "count" and queue to reinit //! \~russian Установить количество loopback портов в "count" и очередь на реинициализацию void setLoopbackPortsCount(int count); //! \~english Returns loopback ports count //! \~russian Возвращает количество loopback портов int loopbackPortsCount() const { return lo_pcnt; } //! \~english If not send_only starts all threaded reads //! \~russian Если не send_only запускает все потоковые чтения void startRead(); //! \~english Stop all threaded reads //! \~russian Остановить все потоковые чтения void stopRead(); //! \~english Reinit all PIEthernets with current \a PIEthernet::allAddresses() //! \~russian Реинициализировать все PIEthernets с текущими \a PIEthernet::allAddresses() void reinit(); //! \~english Send packet //! \~russian Отправить пакет void send(const PIByteArray & data); EVENT1(receiveEvent, PIByteArray, data); //! \events //! \{ //! \fn void receiveEvent(PIByteArray data) //! \brief Raise on packet received //! \} protected: //! Called when packet received virtual void received(PIByteArray data) {} //! Called when addresses are changed virtual void addressesChanged() {} private: EVENT_HANDLER2(void, mcastRead, const uchar *, data, ssize_t, size); void destroyAll(); void initAll(PIVector al); void run() override; Channels _channels; PINetworkAddress mcast_address; PIMutex mcast_mutex; PIVector eth_mcast; PIEthernet * eth_lo; PIVector prev_al; ushort lo_port, bcast_port; int lo_pcnt; bool _started, _send_only, _reinit; }; #endif // PIBROADCAST_H