История изменений
Исправление alysnix, (текущая версия) :
поскольку кусок что я выложил не вполне понятен без контекста кидаю всю функцию. она правда использует некие функции их своей либы, но должно быть вроде все понятно.
это чтение в буфер блока размером fsize с таймаутом ftmo. возвращает число считанных байт, 0 - если вышло по таймауту, или -1 если ошибка
int CryptoConnection::readBlock(void *fbuff, int fsize, uint ftmo){
SSL *lconn = as_SSL(_conn);
int lbytes = 0;
while (true) {
//dbg("---------> try to get ssl block");
if (fsize == lbytes) return lbytes;
if ( SSL_pending(lconn) == 0) {
//WaitResult lwr = waitOnHandle((upHandle)_handle,ftmo);
WaitResult lwr = upNet::waitOnSocket(_handle,ftmo);
switch (lwr) {
case WaitResult::awaited:
// dbg("...awaited...");
break;
case WaitResult::error:
//dbg("---------> error on read block");
return -1;
case WaitResult::logic_error:
//dbg("---------> error on read block");
return -1;
case WaitResult::timeouted:
//dbg("---------> error on read block");
return 0;
default: //timeout
//dbg("--------> exit by timeout");
//return lbytes;
return 0;
}
//dbg("*****awaited");
}
//dbg("---------> SSL block got");
int lres = SSL_read(lconn, fbuff, fsize-lbytes); //non blocking read
if(lres > 0) {
lbytes += lres;
if(lbytes == fsize) return lbytes;
}
else {
int lerr = SSL_get_error(lconn, lres);
switch(lerr){
case SSL_ERROR_WANT_READ:
case SSL_ERROR_WANT_WRITE: continue;
case SSL_ERROR_ZERO_RETURN: ///peer disconnected
dbg("***crypto::readblock: peer disconnected");
ssl_print_errors();
return -1;
case SSL_ERROR_WANT_CONNECT:
case SSL_ERROR_WANT_ACCEPT:
dbg("***crypto::readblock: wants CONNECT/ACCEPT!");
return -1;
case SSL_ERROR_SSL:
dbg("***crypto::readblock: SSL protorcol error!");
return -1;
case SSL_ERROR_SYSCALL:
dbg("***crypto::readblock: SSL error syscall!");
return -1;
case SSL_ERROR_NONE:
dbg("***crypto::readblock: ERROR_NONE!");
return -1;
default:
//break;
dbgInt("***crypto::readblock:unknown result!: ",lerr);
ssl_print_errors();
return -1;
}
}
}
return lbytes;
}
Исходная версия alysnix, :
поскольку кусок что я выложил не вполне понятен без контекста кидаю всю функцию. она правда использует некие функции их своей либы, но должно быть вроде все понятно.
это чтение в буфер блока размером fsize с таймаутом ftmo.
int CryptoConnection::readBlock(void *fbuff, int fsize, uint ftmo){
SSL *lconn = as_SSL(_conn);
int lbytes = 0;
while (true) {
//dbg("---------> try to get ssl block");
if (fsize == lbytes) return lbytes;
if ( SSL_pending(lconn) == 0) {
//WaitResult lwr = waitOnHandle((upHandle)_handle,ftmo);
WaitResult lwr = upNet::waitOnSocket(_handle,ftmo);
switch (lwr) {
case WaitResult::awaited:
// dbg("...awaited...");
break;
case WaitResult::error:
//dbg("---------> error on read block");
return -1;
case WaitResult::logic_error:
//dbg("---------> error on read block");
return -1;
case WaitResult::timeouted:
//dbg("---------> error on read block");
return 0;
default: //timeout
//dbg("--------> exit by timeout");
//return lbytes;
return 0;
}
//dbg("*****awaited");
}
//dbg("---------> SSL block got");
int lres = SSL_read(lconn, fbuff, fsize-lbytes); //non blocking read
if(lres > 0) {
lbytes += lres;
if(lbytes == fsize) return lbytes;
}
else {
int lerr = SSL_get_error(lconn, lres);
switch(lerr){
case SSL_ERROR_WANT_READ:
case SSL_ERROR_WANT_WRITE: continue;
case SSL_ERROR_ZERO_RETURN: ///peer disconnected
dbg("***crypto::readblock: peer disconnected");
ssl_print_errors();
return -1;
case SSL_ERROR_WANT_CONNECT:
case SSL_ERROR_WANT_ACCEPT:
dbg("***crypto::readblock: wants CONNECT/ACCEPT!");
return -1;
case SSL_ERROR_SSL:
dbg("***crypto::readblock: SSL protorcol error!");
return -1;
case SSL_ERROR_SYSCALL:
dbg("***crypto::readblock: SSL error syscall!");
return -1;
case SSL_ERROR_NONE:
dbg("***crypto::readblock: ERROR_NONE!");
return -1;
default:
//break;
dbgInt("***crypto::readblock:unknown result!: ",lerr);
ssl_print_errors();
return -1;
}
}
}
return lbytes;
}