You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
80 lines
2.7 KiB
80 lines
2.7 KiB
/* |
|
* msg_client.h — C++ транспортный клиент для chat GUI |
|
* |
|
* Подключается к utun msg_transport по localhost TCP. |
|
* Протокол: [size:2][type:1][id:8][options:1][data...] (msg_transport.h). |
|
*/ |
|
|
|
#ifndef MSG_CLIENT_H |
|
#define MSG_CLIENT_H |
|
|
|
#include <QObject> |
|
#include <QByteArray> |
|
#include <QTcpSocket> |
|
#include <cstdint> |
|
|
|
class MsgClient : public QObject { |
|
Q_OBJECT |
|
public: |
|
explicit MsgClient(QObject* parent = nullptr); |
|
~MsgClient() override; |
|
|
|
void connectToHost(const QString& host, quint16 port); |
|
void disconnectFromHost(); |
|
bool isConnected() const; |
|
|
|
void bind(quint64 peerId); |
|
void unbind(); |
|
bool isBound() const { return m_boundPeerId != 0; } |
|
quint64 boundPeerId() const { return m_boundPeerId; } |
|
|
|
void send(const QByteArray& data); |
|
void send(const uint8_t* data, size_t len); |
|
void sendSigned(const QByteArray& data); |
|
void sendTo(quint64 dstPeerId, const QByteArray& data); |
|
|
|
void requestPublicKey(); |
|
void requestPrivateKey(); |
|
void requestPeerInfo(quint64 peerId); |
|
|
|
signals: |
|
void connected(); |
|
void disconnected(); |
|
void bound(quint64 peerId); |
|
void unbound(); |
|
void received(quint64 peerId, const QByteArray& data); |
|
void errorOccurred(uint8_t code, const QString& message); |
|
void publicKeyReceived(const QByteArray& key); // 32 байта X25519 |
|
void privateKeyReceived(const QByteArray& key); // 32 байта X25519 |
|
void peerInfoReceived(quint64 peerId, const QByteArray& x25519Pubkey, |
|
const QByteArray& ed25519Pubkey); |
|
|
|
private: |
|
static constexpr size_t kMaxMsgSize = 8192; |
|
static constexpr uint8_t kCtlBind = 0x01; |
|
static constexpr uint8_t kCtlUnbind = 0x02; |
|
static constexpr uint8_t kCtlGetPubkey = 0x03; |
|
static constexpr uint8_t kCtlGetPrivkey = 0x04; |
|
static constexpr uint8_t kCtlGetPeerInfo = 0x05; |
|
static constexpr uint8_t kDataSend = 0x10; |
|
static constexpr uint8_t kDataRecv = 0x11; |
|
static constexpr uint8_t kRspBindOk = 0xE1; |
|
static constexpr uint8_t kRspPubkey = 0xE2; |
|
static constexpr uint8_t kRspPrivkey = 0xE3; |
|
static constexpr uint8_t kRspPeerInfo = 0xE4; |
|
static constexpr uint8_t kRspError = 0xFF; |
|
static constexpr uint8_t kOptSigned = 0x01; |
|
static constexpr size_t kHdrSize = 12; |
|
|
|
QTcpSocket* m_socket; |
|
QByteArray m_recvBuffer; |
|
quint64 m_boundPeerId = 0; |
|
|
|
void onReadyRead(); |
|
void onSocketError(QAbstractSocket::SocketError); |
|
void processMessages(); |
|
void dispatch(uint8_t type, quint64 id, const QByteArray& payload); |
|
QByteArray buildMessage(uint8_t type, quint64 id, uint8_t options, const QByteArray& data); |
|
}; |
|
|
|
#endif // MSG_CLIENT_H
|
|
|