【发布时间】:2015-09-19 04:55:27
【问题描述】:
我正在尝试使用 OpenSSL 创建一个非阻塞套接字,这样我可以循环 SSL_read() 直到没有更多数据,然后中断循环。经过大量工作,我终于使连接正常工作,但现在前一千多次迭代 SSL_read() 将返回 -1。之后,它会给我套接字上的实际数据。 SSL_read() 也没有返回准确的读取字节数,即使它正在读取正确的字节,它也总是说 -1。我能够通过阻塞套接字使其完美工作,但非阻塞似乎有问题......
char *sslRead (connection *c)
{
const int readSize = 1024;
char *rc = NULL;
int r;
int received = -1, count = 0;
int TotalReceived = 0, ReallocSize = 0;
char buffer[1024];
if (c)
{
while (1)
{
received = SSL_read (c->sslHandle, buffer, readSize);
buffer[received] = '\0';
TotalReceived += received;
printf("Buffsize - %i - %s \n", received, buffer);
if (received <= 0)
{
// this line added per advice of Eric Tsui but does not
// change behaviour
received = SSL_read (c->sslHandle, buffer, readSize);
//printf(" received equal to or less than 0\n")
switch (SSL_get_error(c->sslHandle, received))
{
case SSL_ERROR_NONE:
{
printf("SSL_ERROR_NONE %i\n", count);
//if (received != -1)
// goto END;
break;
}
case SSL_ERROR_ZERO_RETURN:
{
printf("SSL_ERROR_ZERO_RETURN %i\n", count);
goto END;
break;
}
case SSL_ERROR_WANT_READ:
{
printf("SSL_ERROR_WANT_READ %i\n", count);
break;
}
case SSL_ERROR_WANT_WRITE:
{
printf("SSL_ERROR_WANT_WRITE %i\n", count);
goto END;
//break;
}
default:
{
printf("error %i\n", received);
break;
}
}
count++;
}
}
}
END:
return rc;
}
如果您以前这样做过,如果您能告诉我这段代码有什么问题,我将不胜感激。谢谢。
【问题讨论】:
-
如果你只是要循环阅读,为什么需要它是非阻塞的?你有什么更好的事情要做吗?
-
因为如果不是 SSL_read() 将阻塞(我没有要搜索的行尾字符)并且程序执行停止。它需要是非阻塞的......
-
你必须在
received = SSL_read (c->sslHandle, buffer, readSize);之后立即检查if (received <= 0) -
感谢 Eric 的帮助,但我做到了,它仍然在无限循环。如何知道最后一个字节已被读取?
-
如果
SSL_read()返回<= 0,请勿再次调用SSL_read()。立即调用SSL_get_error(),然后循环回到循环顶部的SSL_read()仅当错误不是致命错误(SSL_ERROR_WANT_READ、SSL_ERROR_WANT_WRITE等)。