SSL_write() 和 SSL_read() 非阻塞问题
SSL_write() and SSL_read() non-blocking problem
int bytes;
bytes = SSL_write(ssl, buf, num);
bytes = SSL_read(ssl, buf, num);
有没有可能bytes大于0,却出现了SSL_ERROR_WANT_READ或者SSL_ERROR_WANT_WRITE?
从技术上讲不,在非阻塞场景中,服务器或客户端可能随时发起握手。唯一一次字节应该大于 0 的是成功传输,return 值应该是实际写入的字节数。如果 bytes ==0 则存在可以使用 SSL_get_error_() 捕获的错误。类似下面的内容可能会帮助您捕获并处理错误。
int sending=1;
while (sending)
{
bytes=SSL_write(ssl,buf,num);
if(bytes>0)
{
sending=0; //we have sent all the bytes
break;
}
//if we get here there was an error
if(SSL_get_error(ssl,bytes) == SSL_ERROR_WANT_READ || SSL_ERROR_WANT_WRITE)
{
printf("there was an error during I/O operation\n");
//we are still in sending=1 so the IO operation will be attempted again.
}
}
可能有更好的方法来执行此操作,但这是一些非常基本的错误检查,用于查看您的 return 值。另一个注意事项,SSL_get_error() 必须从与 I/O 操作发生的同一线程调用。
int bytes;
bytes = SSL_write(ssl, buf, num);
bytes = SSL_read(ssl, buf, num);
有没有可能bytes大于0,却出现了SSL_ERROR_WANT_READ或者SSL_ERROR_WANT_WRITE?
从技术上讲不,在非阻塞场景中,服务器或客户端可能随时发起握手。唯一一次字节应该大于 0 的是成功传输,return 值应该是实际写入的字节数。如果 bytes ==0 则存在可以使用 SSL_get_error_() 捕获的错误。类似下面的内容可能会帮助您捕获并处理错误。
int sending=1;
while (sending)
{
bytes=SSL_write(ssl,buf,num);
if(bytes>0)
{
sending=0; //we have sent all the bytes
break;
}
//if we get here there was an error
if(SSL_get_error(ssl,bytes) == SSL_ERROR_WANT_READ || SSL_ERROR_WANT_WRITE)
{
printf("there was an error during I/O operation\n");
//we are still in sending=1 so the IO operation will be attempted again.
}
}
可能有更好的方法来执行此操作,但这是一些非常基本的错误检查,用于查看您的 return 值。另一个注意事项,SSL_get_error() 必须从与 I/O 操作发生的同一线程调用。