merged AI doc, some new pages
This commit is contained in:
@@ -1,9 +1,8 @@
|
||||
/*! \file pipeer.h
|
||||
* \ingroup IO
|
||||
* \~\brief
|
||||
* \~english Peering net node
|
||||
* \~russian Элемент пиринговой сети
|
||||
*/
|
||||
//! \~\file pipeer.h
|
||||
//! \~\ingroup IO
|
||||
//! \~\brief
|
||||
//! \~english Peer-to-peer network node
|
||||
//! \~russian Узел одноранговой сети
|
||||
/*
|
||||
PIP - Platform Independent Primitives
|
||||
Peer - named I/O ethernet node, forming self-organized peering network
|
||||
@@ -29,6 +28,16 @@
|
||||
#include "pidiagnostics.h"
|
||||
#include "piethernet.h"
|
||||
|
||||
//! \~\ingroup IO
|
||||
//! \~\brief
|
||||
//! \~english Named network peer built on top of %PIIODevice.
|
||||
//! \~russian Именованный сетевой пир, построенный поверх %PIIODevice.
|
||||
//! \~\details
|
||||
//! \~english
|
||||
//! The class discovers peers, routes packets by peer name and can expose a trusted-peer stream through inherited \a read() and \a write().
|
||||
//! \~russian
|
||||
//! Класс обнаруживает пиры, маршрутизирует пакеты по имени пира и может предоставлять поток trusted-peer через унаследованные \a read() и
|
||||
//! \a write().
|
||||
class PIP_EXPORT PIPeer: public PIIODevice {
|
||||
PIIODEVICE(PIPeer, "peer");
|
||||
|
||||
@@ -36,39 +45,96 @@ private:
|
||||
class PeerData;
|
||||
|
||||
public:
|
||||
//! \~english Constructs a peer node with local name "name".
|
||||
//! \~russian Создает пиринговый узел с локальным именем "name".
|
||||
explicit PIPeer(const PIString & name = PIString());
|
||||
|
||||
//! \~english Destroys the peer node.
|
||||
//! \~russian Уничтожает пиринговый узел.
|
||||
virtual ~PIPeer();
|
||||
|
||||
//! \~\ingroup IO
|
||||
//! \~\brief
|
||||
//! \~english Public information about a discovered peer.
|
||||
//! \~russian Общедоступная информация об обнаруженном пире.
|
||||
class PIP_EXPORT PeerInfo {
|
||||
friend class PIPeer;
|
||||
BINARY_STREAM_FRIEND(PIPeer::PeerInfo);
|
||||
|
||||
public:
|
||||
//! \~english Constructs an empty peer description.
|
||||
//! \~russian Создает пустое описание пира.
|
||||
PeerInfo() {
|
||||
dist = sync = cnt = 0;
|
||||
trace = -1;
|
||||
was_update = false;
|
||||
_data = 0;
|
||||
}
|
||||
|
||||
//! \~english Destroys the peer description.
|
||||
//! \~russian Уничтожает описание пира.
|
||||
~PeerInfo() {}
|
||||
|
||||
//! \~\ingroup IO
|
||||
//! \~\brief
|
||||
//! \~english Network address of a peer endpoint.
|
||||
//! \~russian Сетевой адрес конечной точки пира.
|
||||
struct PIP_EXPORT PeerAddress {
|
||||
//! \~english Constructs a peer address with address and netmask.
|
||||
//! \~russian Создает адрес пира с адресом и маской сети.
|
||||
PeerAddress(const PINetworkAddress & a = PINetworkAddress(), const PINetworkAddress & m = PINetworkAddress("255.255.255.0"));
|
||||
|
||||
//! \~english Returns whether this address has a valid measured ping.
|
||||
//! \~russian Возвращает, есть ли для этого адреса валидный измеренный ping.
|
||||
bool isAvailable() const { return ping > 0; }
|
||||
|
||||
//! \~english Peer address.
|
||||
//! \~russian Адрес пира.
|
||||
PINetworkAddress address;
|
||||
|
||||
//! \~english Netmask for the address.
|
||||
//! \~russian Маска сети для адреса.
|
||||
PINetworkAddress netmask;
|
||||
|
||||
//! \~english Last measured ping in milliseconds, or a negative value if unknown.
|
||||
//! \~russian Последний измеренный ping в миллисекундах, либо отрицательное значение если он неизвестен.
|
||||
double ping; // ms
|
||||
|
||||
//! \~english Returns whether a ping request is currently pending.
|
||||
//! \~russian Показывает, ожидается ли сейчас ответ на ping-запрос.
|
||||
bool wait_ping;
|
||||
|
||||
//! \~english Timestamp of the last ping request or reply.
|
||||
//! \~russian Временная метка последнего ping-запроса или ответа.
|
||||
PISystemTime last_ping;
|
||||
};
|
||||
|
||||
//! \~english Peer name.
|
||||
//! \~russian Имя пира.
|
||||
PIString name;
|
||||
|
||||
//! \~english Known addresses of the peer.
|
||||
//! \~russian Известные адреса пира.
|
||||
PIVector<PeerAddress> addresses;
|
||||
|
||||
//! \~english Distance in hops from the local peer (0 for direct neighbours).
|
||||
//! \~russian Расстояние в хопах от локального пира (0 для прямых соседей).
|
||||
int dist;
|
||||
|
||||
//! \~english Names of direct neighbours for this peer.
|
||||
//! \~russian Имена прямых соседей этого пира.
|
||||
PIStringList neighbours;
|
||||
|
||||
//! \~english Returns whether the peer is a direct neighbour.
|
||||
//! \~russian Возвращает, является ли пир прямым соседом.
|
||||
bool isNeighbour() const { return dist == 0; }
|
||||
|
||||
//! \~english Returns the best known ping in milliseconds.
|
||||
//! \~russian Возвращает наилучший известный ping в миллисекундах.
|
||||
int ping() const;
|
||||
|
||||
//! \~english Returns the fastest known address of the peer.
|
||||
//! \~russian Возвращает самый быстрый известный адрес пира.
|
||||
PINetworkAddress fastestAddress() const;
|
||||
|
||||
protected:
|
||||
@@ -87,47 +153,148 @@ public:
|
||||
|
||||
BINARY_STREAM_FRIEND(PIPeer::PeerInfo);
|
||||
|
||||
//! \~english Sends byte array "data" to peer "to".
|
||||
//! \~russian Отправляет массив байт "data" пиру "to".
|
||||
//! \~\details
|
||||
//! \~english Sends the specified byte array to the peer identified by name using the most efficient route.
|
||||
//! \~russian Отправляет указанный байтовый массив пиру, идентифицируемому по имени, используя наиболее эффективный маршрут.
|
||||
bool send(const PIString & to, const PIByteArray & data) { return send(to, data.data(), data.size_s()); }
|
||||
|
||||
//! \~english Sends string "data" to peer "to".
|
||||
//! \~russian Отправляет строку "data" пиру "to".
|
||||
//! \~\details
|
||||
//! \~english Sends the specified string to the peer identified by name using the most efficient route.
|
||||
//! \~russian Отправляет указанную строку пиру, идентифицируемому по имени, используя наиболее эффективный маршрут.
|
||||
bool send(const PIString & to, const PIString & data) { return send(to, data.data(), data.size_s()); }
|
||||
|
||||
//! \~english Sends raw buffer to peer "to".
|
||||
//! \~russian Отправляет сырой буфер пиру "to".
|
||||
bool send(const PIString & to, const void * data, int size);
|
||||
|
||||
//! \~english Sends byte array "data" to peer described by "to".
|
||||
//! \~russian Отправляет массив байт "data" пиру, описанному в "to".
|
||||
bool send(const PeerInfo & to, const PIByteArray & data) { return send(to.name, data.data(), data.size_s()); }
|
||||
|
||||
//! \~english Sends string "data" to peer described by "to".
|
||||
//! \~russian Отправляет строку "data" пиру, описанному в "to".
|
||||
bool send(const PeerInfo & to, const PIString & data) { return send(to.name, data.data(), data.size_s()); }
|
||||
|
||||
//! \~english Sends raw buffer to peer described by "to".
|
||||
//! \~russian Отправляет сырой буфер пиру, описанному в "to".
|
||||
bool send(const PeerInfo & to, const void * data, int size) { return send(to.name, data, size); }
|
||||
|
||||
//! \~english Sends byte array "data" to peer pointer "to".
|
||||
//! \~russian Отправляет массив байт "data" пиру по указателю "to".
|
||||
bool send(const PeerInfo * to, const PIByteArray & data);
|
||||
|
||||
//! \~english Sends string "data" to peer pointer "to".
|
||||
//! \~russian Отправляет строку "data" пиру по указателю "to".
|
||||
bool send(const PeerInfo * to, const PIString & data);
|
||||
|
||||
//! \~english Sends raw buffer to peer pointer "to".
|
||||
//! \~russian Отправляет сырой буфер пиру по указателю "to".
|
||||
bool send(const PeerInfo * to, const void * data, int size);
|
||||
|
||||
//! \~english Sends byte array "data" to all known peers.
|
||||
//! \~russian Отправляет массив байт "data" всем известным пирам.
|
||||
void sendToAll(const PIByteArray & data);
|
||||
|
||||
//! \~english Sends string "data" to all known peers.
|
||||
//! \~russian Отправляет строку "data" всем известным пирам.
|
||||
void sendToAll(const PIString & data);
|
||||
|
||||
//! \~english Sends raw buffer to all known peers.
|
||||
//! \~russian Отправляет сырой буфер всем известным пирам.
|
||||
void sendToAll(const void * data, int size);
|
||||
|
||||
//! \~english Returns whether multicast reception is active.
|
||||
//! \~russian Возвращает, активно ли получение multicast-пакетов.
|
||||
bool isMulticastReceive() const { return !eths_mcast.isEmpty(); }
|
||||
|
||||
//! \~english Returns whether broadcast reception is active.
|
||||
//! \~russian Возвращает, активно ли получение broadcast-пакетов.
|
||||
bool isBroadcastReceive() const { return !eths_bcast.isEmpty(); }
|
||||
|
||||
//! \~english Returns service-channel diagnostics.
|
||||
//! \~russian Возвращает диагностику служебного канала.
|
||||
PIDiagnostics & diagnosticService() { return diag_s; }
|
||||
|
||||
//! \~english Returns payload-channel diagnostics.
|
||||
//! \~russian Возвращает диагностику канала данных.
|
||||
PIDiagnostics & diagnosticData() { return diag_d; }
|
||||
|
||||
//! \~english Returns all currently known peers.
|
||||
//! \~russian Возвращает всех известных на данный момент пиров.
|
||||
const PIVector<PIPeer::PeerInfo> & allPeers() const { return peers; }
|
||||
|
||||
//! \~english Returns whether a peer with name "name" is known.
|
||||
//! \~russian Возвращает, известен ли пир с именем "name".
|
||||
bool isPeerExists(const PIString & name) const { return getPeerByName(name) != 0; }
|
||||
|
||||
//! \~english Returns peer information by name, or null if absent.
|
||||
//! \~russian Возвращает информацию о пире по имени, либо null если пир не найден.
|
||||
const PeerInfo * getPeerByName(const PIString & name) const { return peers_map.value(name, 0); }
|
||||
|
||||
//! \~english Returns information about the local peer.
|
||||
//! \~russian Возвращает информацию о локальном пире.
|
||||
const PeerInfo & selfInfo() const { return self_info; }
|
||||
|
||||
//! \~english Returns routing map used to reach known peers.
|
||||
//! \~russian Возвращает карту маршрутов, используемую для доступа к известным пирам.
|
||||
const PIMap<PIString, PIVector<PeerInfo *>> & _peerMap() const { return addresses_map; }
|
||||
|
||||
//! \~english Rebuilds the peer network state and restarts discovery sockets.
|
||||
//! \~russian Перестраивает состояние сети пиров и перезапускает сокеты обнаружения.
|
||||
void reinit();
|
||||
|
||||
//! \~english Locks the peer list for manual external access.
|
||||
//! \~russian Блокирует список пиров для внешнего ручного доступа.
|
||||
void lock() { peers_mutex.lock(); }
|
||||
|
||||
//! \~english Unlocks the peer list after external access.
|
||||
//! \~russian Снимает блокировку списка пиров после внешнего доступа.
|
||||
void unlock() { peers_mutex.unlock(); }
|
||||
|
||||
//! \~english Changes local peer name and updates related diagnostics names.
|
||||
//! \~russian Изменяет имя локального пира и обновляет связанные диагностические имена.
|
||||
void changeName(const PIString & new_name);
|
||||
|
||||
//! \~english Returns trusted peer name used by inherited \a read() and \a write().
|
||||
//! \~russian Возвращает имя доверенного пира, используемое унаследованными \a read() и \a write().
|
||||
const PIString & trustPeerName() const { return trust_peer; }
|
||||
|
||||
//! \~english Sets trusted peer name for inherited \a read() and \a write().
|
||||
//! \~russian Устанавливает имя доверенного пира для унаследованных \a read() и \a write().
|
||||
void setTrustPeerName(const PIString & peer_name) { trust_peer = peer_name; }
|
||||
|
||||
//! \~english Sets TCP server address used for peer discovery fallback.
|
||||
//! \~russian Устанавливает адрес TCP-сервера, используемого как резервный канал обнаружения пиров.
|
||||
void setTcpServerIP(const PIString & ip);
|
||||
|
||||
//! \~english Returns size of the next buffered payload from the trusted peer stream.
|
||||
//! \~russian Возвращает размер следующей буферизованной полезной нагрузки из trusted-peer потока.
|
||||
ssize_t bytesAvailable() const override;
|
||||
|
||||
//! \events
|
||||
//! \{
|
||||
|
||||
//! \fn void dataReceivedEvent(const PIString & from, const PIByteArray & data)
|
||||
//! \~english Raised when payload data is delivered from peer "from".
|
||||
//! \~russian Вызывается, когда полезные данные доставлены от пира "from".
|
||||
EVENT2(dataReceivedEvent, const PIString &, from, const PIByteArray &, data);
|
||||
|
||||
//! \fn void peerConnectedEvent(const PIString & name)
|
||||
//! \~english Raised when a new peer becomes available.
|
||||
//! \~russian Вызывается, когда становится доступен новый пир.
|
||||
EVENT1(peerConnectedEvent, const PIString &, name);
|
||||
|
||||
//! \fn void peerDisconnectedEvent(const PIString & name)
|
||||
//! \~english Raised when a known peer disappears from the network.
|
||||
//! \~russian Вызывается, когда известный пир исчезает из сети.
|
||||
EVENT1(peerDisconnectedEvent, const PIString &, name);
|
||||
|
||||
//! \}
|
||||
|
||||
// bool lockedEth() const {return eth_mutex.isLocked();}
|
||||
// bool lockedPeers() const {return peers_mutex.isLocked();}
|
||||
// bool lockedMBcasts() const {return mc_mutex.isLocked();}
|
||||
@@ -135,8 +302,16 @@ public:
|
||||
// bool lockedMCSends() const {return send_mc_mutex.isLocked();}
|
||||
|
||||
protected:
|
||||
//! \~english Reimplement to handle incoming payload data.
|
||||
//! \~russian Переопределите для обработки входящих полезных данных.
|
||||
virtual void dataReceived(const PIString & from, const PIByteArray & data) { ; }
|
||||
|
||||
//! \~english Reimplement to react to peer appearance.
|
||||
//! \~russian Переопределите для реакции на появление пира.
|
||||
virtual void peerConnected(const PIString & name) { ; }
|
||||
|
||||
//! \~english Reimplement to react to peer disappearance.
|
||||
//! \~russian Переопределите для реакции на исчезновение пира.
|
||||
virtual void peerDisconnected(const PIString & name) { ; }
|
||||
|
||||
EVENT_HANDLER2(bool, dataRead, const uchar *, readed, ssize_t, size);
|
||||
|
||||
Reference in New Issue
Block a user