Openssl BIO_read不会返回

时间:2014-08-15 12:35:29

标签: 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 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没有提到这样的错误或我还没有找到它。

我很期待你的意见。

金问候,

Greenality

1 个答案:

答案 0 :(得分:1)

确定,

我发现了我的错误。如果其他人遇到像我这样的问题,我就写这个:

BIO_write(bio, buf_write, strlenbuf)

问题不是BIO_write而是strlenbuf的值。 我在buf_write数组中添加了两个字符,但没有更新变量strlenbuf并存储了字符串的长度(strlenbuf = strlen(buf_write)),因此字符串terminato(&#39; \ 0&#39;)未被发送,所以我没有完成我的服务器请求,这导致了这个问题。