【メモ】TCP長接続におけるパッケージ問題の解決
2100 ワード
TCPカスタムヘッダ構造体:
定義する変数:
変数初期化:(connect_server()などの接続を作成する関数)
tcpメッセージの更新処理スロット
前に信号スロットをバインドする必要があることに注意してください.
tcpsocketオブジェクトのreadyRead信号にバインドされ、connect_などの接続を作成する関数に前の変数の初期化とともに配置できます.server()
/*!
* @brief tcp
*/
struct TcpPacketHead{
TcpPacketHead():flag(0X52474B4A)
{
}
uint flag; /*!< 0X52474B4A */
uint index; /*!< */
uint msgType; /*!< */
ushort length; /*!< */
ushort totalLenth; /*!< */
ushort recvId; /*!< id */
ushort taskId; /*!< id */
};
定義する変数:
/********** tcp **************/
qint64 bytesReceived; /** tcp */
qint64 recv_totalBytes; /** tcp */
Datastruct::TcpPacketHead *now_tcpHead;/** tcp */
QByteArray now_recv_array;/** tcp , , , */
変数初期化:(connect_server()などの接続を作成する関数)
bytesReceived = 0; /** tcp 0 */
recv_totalBytes = 0; /** tcp 0 */
now_tcpHead = NULL;/** tcp */
now_recv_array.clear();/** */
tcpメッセージの更新処理スロット
/**
* @brief TcpClient::slotdisconnected
* ,
*/
void TcpClient::slotdisconnected()
{
stateTimer->stop();
qDebug()<bytesAvailable();
QByteArray recv_array = tcpsocket->readAll();
qDebug()<sizeof(Datastruct::TcpPacketHead))&&(now_tcpHead == NULL))/** , , */
{
now_tcpHead = (Datastruct::TcpPacketHead *)now_recv_array.data();
recv_totalBytes = now_tcpHead->totalLenth;
if((now_tcpHead->flag)== 0X52474B4A)
{/** */
if(bytesReceived recv_totalBytes)/** */
{ qDebug()<
前に信号スロットをバインドする必要があることに注意してください.
connect(tcpsocket, &QTcpSocket::readyRead, this, &TcpClient::slot_updateTcpPackage);
tcpsocketオブジェクトのreadyRead信号にバインドされ、connect_などの接続を作成する関数に前の変数の初期化とともに配置できます.server()