【メモ】TCP長接続におけるパッケージ問題の解決

2100 ワード

TCPカスタムヘッダ構造体:
/*!
 * @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()