ошибка 11 Ресурс, временно недоступный для блокировки сокета, приводит к возникновению исключения и закрытию сокета - PullRequest
0 голосов
/ 17 ноября 2018

Ошибка чтения сокета при чтении (DoRead) из сокета, ошибка 11: Ресурс временно недоступен. В результате этого события сокет закрывается. Функция DoRead вызывает RecvAsync. Я вставил журналы и вызовы функций ниже. Функция RecvAsync inturn вызывает Recv. Функция Recv вернет 0 только для случая переключения 0. Обратите внимание на следующее, если условие будет истинным в этом случае и должно выдать исключение.

if(!m_socket.RecvAsync( m_readdata, &len ))
ThrowException( "error reading from socket" );

Но, согласно журналам, генерируется исключение с ошибкой 11 для случая переключателя SOCKET_ERROR, WillBlock (). Я не могу понять, как SOCKET_ERROR будет возвращать 0? Он возвращает WillBlock (), который inturn возвращает errno, который является ненулевым значением. Hence RecvAsync должен возвращать ненулевое значение. Так что условие if должно быть ложным. Hence не должен приводить к исключению Правильно ли мое понимание? Пожалуйста, объясните.

Журналы:

OnException :: исключение - ошибка чтения из сокета 127.0.0.1:49370, ошибка 11 Ресурс временно недоступен

закрытая розетка

Функция:

bool DoRead()
{
try{
if ( !m_socket.RecvAsync( m_readdata, &len ) )
        ThrowException( "error reading from socket" );
      if ( len == 0 )
        break;      // socket-buffer empty ?

}
 catch( std::exception & e )
  {
    OnException( e );
    Close();
    return false;
  }
}

bool Socket::RecvAsync( void *data, int *len )
{
  int result = Recv( data, *len );
  switch( result )
  {
    case SOCKET_ERROR :
      *len = 0;
      return WouldBlock();
    case 0 :
      *len = 0;
      return false;
    default:
      *len = result;
      return true;
  }
}

bool WouldBlock()                               
{ 
return errno == EINPROGRESS || errno == EWOULDBLOCK || errno == EALREADY;
}

#define SOCKET_ERROR       (-1)
#define EINPROGRESS 9928
#define EWOULDBLOCK 9930
#define EALREADY 9907
#define false 0
#define true  1

Спасибо

...