Как узнать, когда при использовании SSL_read () больше нет ответов от сервера - PullRequest
0 голосов
/ 21 февраля 2019

Я новичок в программировании сокетов.

Этот фрагмент кода ниже для получения ответа приблизительно 1 миллиона строк с сервера.Я не знаю точную длину ответа и, следовательно, проверяю, состоит ли группа ответов из конечных слов, таких как OK, NO, SUCCESS, FAILURE и т. Д.

size = 8192;
while(1)
{
     readBytes = SSL_read(SSL, buff, size);
     buff[readBytes] = 0;
     if (readBytes <= 0) {
        int errorno = SSL_get_error(SSL, readBytes);
        throw ZIMAPEXPBadSSL(GetSSLError("SSL read failed", errorno, ERR_get_error()));
     }
     else {
        rsp += buff;
        if(checking_Here_If_The_Response_Is_Complete(buff))
           break;
     }
}

Это занимает больше времени, чем длякаждая полученная связка проверяет, достигнут ли конец.Например, он проверяет каждые 50 строк каждый раз, пока не наступит миллионная строка.

Я использую OpenSSL.Я погуглил и получил предложения типа использования SELECT ().

1 Ответ

0 голосов
/ 21 февраля 2019

Проблема не имеет ничего общего с SSL, но с протоколом приложения.Это относится не только к SSL_read, но и к обычному read.И использование select или аналогичного здесь не поможет.

Основываясь на вашем описании, протокол приложения состоит из последовательности сообщений, размер сообщения в которой изменяется, а длина неизвестна заранее.В этом случае нет другого способа, кроме как прочитать некоторые данные и проверить, завершено ли теперь сообщение.Если вместо этого длина сообщения будет известна заранее (например, с помощью префикса каждого сообщения с фиксированным значением длины размера), то вы можете просто прочитать известное количество байтов, и никаких сложных проверок не потребуется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...