我有一个 BIO_read 问题,但没有解决。我想将来自服务器的行打印到屏幕上。在 gdb 的帮助下,我可以找出问题所在,但我现在不知道该怎么办。问题是该函数被正确调用,但是当执行 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 中,当调用 BIO_read 时,程序会卡住。
有人有这方面的经验吗,我在他们的网站上找不到任何相关内容:openssl没有提到这样的错误或者我还没有发现它。
最佳答案
好的,
我发现了我的错误。如果其他人和我有同样的问题,我就写这个:
BIO_write(bio, buf_write, strlenbuf)
问题不是 BIO_write 而是 strlenbuf 的值。 我已向 buf_write 数组添加了两个字符,但未更新变量 strlenbuf 并存储了字符串的长度( strlenbuf = strlen(buf_write) ),因此字符串终止符('\0')未发送,因此我尚未完成我的服务器请求,这导致了这个问题。
关于c - Openssl BIO_read 不返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25326497/