У меня проблема с BIO_read Я не избавлюсь. Я хочу напечатать строки на экране, который пришел с сервера. С помощью gdb я мог узнать, где проблема, но я не делаю сейчас. Проблема в том, что функция вызывается правильно, но затем, когда выполняется BIO_read, она выглядит как бесконечный цикл, так как она не возвращается и не заканчивается. Мой код выглядит следующим образом:Openssl BIO_read не возвращается
//This function should print one line to screen
int WebPrintLine(BIO *bio) {
unsigned char *x;
unsigned int i;
unsigned char buffer[4096];
unsigned int sizeofbuffer = sizeof(buffer);
//Print each char until newline char or terminator char appear and next loop turn if it would affect memory not owned by the arry buffer
do {
WebRead(bio, buffer, sizeofbuffer);
for(i = 0; (buffer[i] != '\n') && (buffer[i] != '\0') && (i < sizeofbuffer); i++)
putchar(buffer[i]);
}while((buffer[i] != '\n') && (buffer[i] != '\0') && (x != 0));
putchar('\n');
return 0;
}
/*This function should receive and returns a char to the buffer
BIO_gets could also be used to get just one line but it does not work always so I have not put it in
Return 0 on error*/
unsigned char *WebRead(BIO *bio, unsigned char buffer[], int sizeofbuffer) {
int bytes_read; //Temporarily store how many bytes were read: for error checking
bytes_read = BIO_read(bio, buffer, sizeofbuffer);
if(bytes_read == 0) {
//No more data available on an non-blocking connection
return 0;
}
else if(bytes_read < 0) {
//Error occured, retry and if this fails return 0
if(! BIO_should_retry(bio))
return 0;
}
return buffer;
}
Я с нетерпением жду, чтобы услышать от вас.
Функция WebPrintLine называется еще два раза раньше и работает правильно. Но в gdb программа stucks при вызове BIO_read.
У кого-нибудь есть опыт с этим, я не нашел ничего подходящего и на вашем сайте: openssl такой ошибки не упоминается, или я еще не нашел его.
Я с нетерпением жду ehar от вас.
King С уважением,
Greenality
Потому что поток 'BIO' блокируется? Это означает, что если нет данных для чтения, функция блокирует (ждет) доступность данных. Идите в свою любимую поисковую систему и ищите дополнительную информацию. –
@Joachim Pileborg Но на opensl он говорит: «Все эти функции возвращают либо количество данных, которые были успешно прочитаны или записаны (если возвращаемое значение положительное) или что данные не были успешно прочитаны или записаны, если результат равен 0 или -1 . Если возвращаемое значение равно -2, операция не будет реализована в конкретном типе BIO. «Для меня это звучит, если нет данных, которые он вернет 0 или -1 – Con
И на сайте IBM говорится:« BIO_read будет попытайтесь прочитать определенное количество байтов с сервера. Он возвращает количество прочитанных байтов или 0 или -1. В блокирующем соединении возврат 0 означает, что соединение было закрыто, а -1 указывает, что произошла ошибка .На неблокирующем соединении возврат 0 означает, что данные не доступны, а -1 указывает на ошибку.Чтобы определить, восстанавливается ли ошибка, вызовите BIO_should_retry. «Так что если бы это было блокирование, я бы получил возврат, Я? – Con