错误11资源暂时无法用于阻止套接字,导致套接字抛出异常并关闭

时间:2018-11-17 05:41:36

标签: sockets unix-socket

从套接字读取(DoRead)时出现套接字错误,错误11:资源暂时不可用,这反过来导致套接字被关闭。 DoRead函数调用RecvAsync。 我已经在下面粘贴了日志和函数调用。 RecvAsync函数会依次调用Recv。Revv函数仅在开关情况为0时返回0。因此,如果在这种情况下条件为true,则下面将引发异常。

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

但是根据日志,对于开关情况SOCKET_ERROR,WouldBlock(),抛出了异常,错误11。 我不明白SOCKET_ERROR将如何返回0?它返回WouldBlock(),这又返回了非零值的errno。因此RecvAsync应该返回非零值。因此if条件应该为false。因此不应导致异常我的理解正确吗?请说明理由。

日志:

OnException ::异常是从套接字127.0.0.1:49370读取错误,错误11资源暂时不可用

OnClosed套接字

功能:

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

谢谢

0 个答案:

没有答案