2014-08-15 1 views
0

У меня проблема с 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

+0

Потому что поток 'BIO' блокируется? Это означает, что если нет данных для чтения, функция блокирует (ждет) доступность данных. Идите в свою любимую поисковую систему и ищите дополнительную информацию. –

+0

@Joachim Pileborg Но на opensl он говорит: «Все эти функции возвращают либо количество данных, которые были успешно прочитаны или записаны (если возвращаемое значение положительное) или что данные не были успешно прочитаны или записаны, если результат равен 0 или -1 . Если возвращаемое значение равно -2, операция не будет реализована в конкретном типе BIO. «Для меня это звучит, если нет данных, которые он вернет 0 или -1 – Con

+0

И на сайте IBM говорится:« BIO_read будет попытайтесь прочитать определенное количество байтов с сервера. Он возвращает количество прочитанных байтов или 0 или -1. В блокирующем соединении возврат 0 означает, что соединение было закрыто, а -1 указывает, что произошла ошибка .На неблокирующем соединении возврат 0 означает, что данные не доступны, а -1 указывает на ошибку.Чтобы определить, восстанавливается ли ошибка, вызовите BIO_should_retry. «Так что если бы это было блокирование, я бы получил возврат, Я? – Con

ответ

1

Ok,

Я нашел мою ошибку. Я просто пишу это, если кто-то имеет такие же проблемы, как и я:

BIO_write(bio, buf_write, strlenbuf) 

Проблема была не BIO_write но значение strlenbuf. Я добавил два символа в массив buf_write, но не обновил переменную strlenbuf с сохранением длины строки (strlenbuf = strlen (buf_write)), поэтому строка terminato ('\ 0') не была отклонена, и поэтому у меня не было завершил мой запрос на сервер, и это вызвало эту проблему.

Смежные вопросы