QTcpSocket не читает все

#qt #sockets #encryption

#qt #сокеты #шифрование

Вопрос:

Я пытаюсь использовать cryptopp с QTcpSocket, что я делаю, это шифрую имя пользователя на стороне моего клиента, отправляю его через TCPSocket и расшифровываю его на стороне сервера. Вот моя проблема, QTcpSocket не читает все сообщение, как вы можете видеть на стороне сервера, я ожидаю получить несколько пакетов для одного шифра, метод чтения говорит, что все сообщение было прочитано, но в моем символе * я не вижу всего этого на самом деле…. Вот мой код, отправляющий шифр :

 char size[5];
sprintf(size,"%d{",crypted_mess.size());

int written = 0;
written = socket->write(size);
written = socket->write(crypted_mess.c_str(),crypted_mess.size()  1);
socket->waitForBytesWritten(crypted_mess.size());
string recovered = T.discryptor(crypted_mess) ;
 

и мой код для его расшифровки (отлично работает на стороне клиента без отправки сообщения) :

     if(paquet_missing_size == 0) {
        current_message->clear();
        was_read = socket->read(start_message,1000);

        int message_start = 0;
        while(start_message[message_start]!= '{')
            message_start  ;

        char *size_total_string;
        size_total_string = (char*)malloc (message_start * sizeof (char));

        for(int j = 0 ;j < message_start;j    ){
            size_total_string[j] = start_message[j];
        }

        size_total_string[message_start] = '' ;
        paquet_missing_size = atoi(size_total_string);
        memcpy(read,start_message message_start 1,was_read - message_start);
    }
    else
        was_read = socket->read(read,1000);

    // add the read thing to the current_message
    if(was_read <= paquet_missing_size) {
        current_message->append(read, was_read);
        paquet_missing_size -= was_read;
    } else {
        current_message->append(read, paquet_missing_size);
        paquet_missing_size = 0;
    }
 

Ответ №1:

для этой цели вы всегда должны использовать QByteArray с QDataStream, чтобы сначала передать размер сообщения, а затем ваше сообщение.

Надеюсь, это поможет.

Комментарии:

1. Большое спасибо, это сделало свое дело! я опубликую ответ на код позже!

2. Вы должны добавить, что причиной этого является то, что TCP / IP является потоковым протоколом. Это гарантирует только то, что байты попадут туда, а не то, что они попадут туда в виде кусков определенного размера. Вполне допустимо, чтобы байты поступали по одному за раз.