c - Openssl BIO_read 不返回

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

最佳答案

好的,

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

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/

相关文章:

java - 检测 Java Future 上的超时异常而不调用 get()

python - 使用 python 定义网络请求超时

c - 求 1000 以下所有 3 或 5 的倍数之和

c - 为什么我的 snmp 数据包无效

c - C中的括号怎么写?

c++ - 可以将套接字从非阻塞更改为阻塞然后再次非阻塞吗?

go - Golang中如何使用Openssl RSA公私钥对数据进行加解密?

ssl - 无法重启 nginx https 证书例程私钥不匹配

c# - Database.ExecuteNonQuery 不返回

c - openMP:在子函数中使用全局变量