从套接字读取(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
谢谢