C Openssl BIO_读取不返回

C Openssl BIO_读取不返回,c,openssl,timeout,client,C,Openssl,Timeout,Client,我对BIO_read有个问题,我无法摆脱。我想在屏幕上打印来自服务器的行。在gdb的帮助下,我可以找出问题所在,但我现在不知道该怎么办。问题是函数被正确调用,但是当BIO_read被执行时,它感觉就像一个无休止的循环,因为它不会返回或结束。 我的代码如下所示: //This function should print one line to screen int WebPrintLine(BIO *bio) { unsigned char *x; unsigned int i; unsigned

我对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;
}
//此函数应在屏幕上打印一行
int WebPrintLine(BIO*BIO){
无符号字符*x;
无符号整数i;
无符号字符缓冲区[4096];
无符号整数sizeofbuffer=sizeof(缓冲区);
//打印每个字符,直到出现换行符或终止符字符,如果它会影响arry缓冲区不拥有的内存,则执行下一个循环
做{
网络阅读(bio、缓冲区、sizeofbuffer);
对于(i=0;(缓冲区[i]!='\n')&(缓冲区[i]!='\0')&(i
我期待着收到你的来信

函数WebPrintLine在此之前又被调用了两次,并且工作正常。但是在gdb中,当调用BIO_read时,程序会阻塞

有没有人有过这样的经历,我在他们的网站上找不到任何相关的东西:没有提到这样的错误,或者我还没有找到它。

好的

我发现了我的错误。如果其他人和我一样有同样的问题,我就写这个:

BIO_write(bio, buf_write, strlenbuf)
问题不在于BIO_write,而在于strlenbuf的价值。
我在buf_写入数组中添加了两个字符,但没有用存储的字符串长度(strlenbuf=strlen(buf_写入))更新变量strlenbuf,因此字符串terminator('\0')没有发送,因此我没有完成服务器请求,这导致了这个问题。

因为
BIO
流被阻塞了吗?这意味着如果没有要读取的数据,函数将阻塞(等待)数据。转到您最喜欢的搜索引擎,在那里查找更多信息。@Joachim Pileborg但在openssl上显示:“所有这些函数都返回成功读取或写入的数据量(如果返回值为正值)或者,如果结果为0或-1,则未成功读取或写入任何数据。如果返回值为-2,则该操作未在特定的BIO类型中实现。“对我来说,如果没有数据,它将返回0或-1,并且在IBM站点上,它会说:“BIO_read将尝试从服务器读取一定数量的字节。它返回读取的字节数,或0或-1。在阻塞连接上,返回0表示连接已关闭,而-1表示发生错误。在非阻塞连接上,返回0表示没有可用数据,-1表示错误。要确定错误是否可恢复,请调用BIO_should_重试。因此,如果它阻塞了,我会得到一个返回,不是吗?在文章中,它还说:“0或-1返回不一定表示错误。特别是当源/接收器为非阻塞或某一类型时,它可能只是指示当前没有可用数据,应用程序应稍后重试该操作。”(我的重点)。这似乎表明生物源确实可以阻塞。和套接字(我认为最常见的源)默认情况下是阻塞的。我还要说,您的IBM报价符合我的假设。事实上,标准socket
read
(或recv
)函数返回相同的(
0`在对等方关闭连接时,
-1
在错误时)对于阻塞套接字。对于非阻塞套接字,
read
/
recv
返回
-1
,并显示一个特定错误,表示目前没有可用数据。