0

ソケットからデータを読み取り、受信したデータをデータグラムから HostMessage に入れています。しかし、HostMessage->MessageHeader を表示しようとすると、無効なデータが表示されます。また、データグラムの出力は、wireshark の出力によって少し異なるように見えます。

ntonl関数でこの問題を修正しました(そして、データグラムのすべてではなく、MessageHeaderに適用しました!!)、bは正しい結果です。このソリューションでは、すべての構造体メンバーに ntonl を適用する必要があり、100 を超えるメンバーがあります。

これを修正するための解決策やアイデアはありますか?

コード:

unsigned int ntonl(unsigned int a){
    unsigned int b;
    char* pA = (char*)&a;
    char* pB = (char*)&b;

    for (int i = 0; i < sizeof(pA); i++){
        pB[i] = pA[(sizeof(pA)-1) - i];
    }

    return b;
}

void myDevice::processPendingDatagrams(){
    while (m_udpSocket->hasPendingDatagrams()){
    QByteArray datagram;
            datagram.resize(m_udpSocket->pendingDatagramSize());

            QHostAddress sender;
            quint16 senderPort;

            qint64 dataReceivedLength = m_udpSocket->readDatagram(datagram.data(),
                                                                  datagram.size(),
                                                                  &sender,
                                                                  &senderPort);

    tagHostMessage* HostMessage = (tagHostMessage*)datagram.data();

    qDebug("datagram: %x-%x-%x-%x", datagram.data()[0], datagram.data()[1], datagram.data()[2], datagram.data()[3]);
    qDebug()<<"msg header: " << HostMessage->MessageHeader[0] << "=" << HostMessage->MessageHeader;

    b = ntonl(HostMessage->MessageHeader[0])
}

私の構造体:

typedef struct tagHostMessage{
    unsigned int        MessageHeader[4];
    TMessageData MessageData;
    short int    CheckSum;

}THostMessage,*PHostMessage;

Wireshark の出力 (1024 バイト):

0d:cc:97:e0:00:00:00:00:00:00:00:00:00:....

qDebug の出力:

datagram: d-ffffffcc-ffffff97-ffffffe0

msg header:  3768044557 = 0x9be9b8 

a = e097cc0d    
b = 0dcc97e0 
4

1 に答える 1