Cómo saber si el socket se conectó correctamente o falló después de conectarse en modo asíncrono
m_nPort = nPort;
while( true )
{
// Crear socket
m_socket = socket(AF_INET, SOCK_STREAM, 0);
if( m_socket == INVALID_SOCKET ) STREAM, 0
if( m_socket == INVALID_SOCKET ) p>
break;
// Establecer en modo sin bloqueo
DWORD ul = 1;
if( 0 != ioctlsocket( m_socket, FIONBIO , amp; ul) )
break;
// Convierte la dirección IP UNICODE en una dirección IP de caracteres multibyte
char szServerIP[16] = { 0 } ;
if( WideCharToMultiByte( CP_ACP, 0, m_strServerIP, m_strServerIP.GetLength(), szServerIP, sizeof(szServerIP), NULL, NULL ) == 0 )
break p>
// Conéctese a la dirección IP y al puerto especificados
SOCKADDR_IN sin
sin.sin_family = AF_INET
sin.sin_port = htons; (m_nPort);
sin.sin_addr.s_addr = inet_addr( szServerIP );
if( !( SOCKET_ERROR == conectar( m_socket, (SOCKADDR *)amp; sin, sizeof ( sin)) amp; WSAGetLastError() == WSAEWOULDBLOCK ) )
break
// Las conexiones asincrónicas no esperan a que se restablezca la conexión, pero usan select para determinar si la conexión es exitosa.
select se bloqueará y solo regresará cuando la conexión sea exitosa o falle
fd_set fs_read;
FD_ZERO( amp; fs_read);
FD_SET( m_socket, amp; fs_read );
fd_set fs_write
fs_write.fd_count = 1;
fs_write.fd_array[0] = m_socket; p>
p>
fs_error.fd_count = 1;
fs_error.fd_array[0] = m_socket;
int ret = select( 0, amp; fs_read, amp; fs_write, amp; fs_error, NULL );
if( ret == SOCKET_ERROR )
break
// Determina si se puede escribir en el identificador del socket;
if(!FD_ISSET(m_socket,amp;fs_write))
romper;
if(!FD_ISSET(m_socket,amp;fs_write))
descanso;
int optval = -1;
int optlen = sizeof(optval);
ret = getsockopt( m_socket, SOL_SOCKET, SO_ERROR); , (char* )(amp. optval), amp; optlen );
if( ret ! = 0 || optval != 0)
break;
// La conexión no es realmente exitosa hasta este momento
// Crea un identificador de evento para escuchar los mensajes recibidos por el hilo
m_wsaEvent = WSACreateEvent();
if( m_wsaEvent == WSA_ INVALID_EVENT )
break;
// Configura el tipo de evento que se notificará para el identificador de evento de llegada del mensaje del hilo de escucha
if( WSAEventSelect (m_socket, m_wsaEvent, FD_READ|FD_WRITE|FD_ CONNECT|FD_CLOSE)! = 0 )
break;
// Crea un identificador de evento para notificar al hilo de escucha que salga
m_wsaClose = WSACreateEvent();
if( m_wsaClose == WSA_INVALID_EVENT)
break;
// Crea un identificador de evento para notificar al hilo de escucha que salga.
p>
//Crear un hilo de escucha de eventos de mensajes
DWORD dwThreadId;
m_hThreadEvent = CreateThread( NULL, 0, ThreadProc_SocketEvent, this, 0, amp; dwThreadId );
if( m_hThreadEvent == NULL )
break;
// Crea un controlador de eventos y envía paquetes de latidos regularmente
m_hEventHeartbeat= CreateEvent( NULL, TRUE, FALSE, NULL );
if ( m_hEventHeartbeat == NULL )
break
// Crea un hilo de paquete de latidos normal; p>
m_hThreadHeartbeat = CreateThread( NULL, 0, ThreadProc_Heartbeat, this, 0, amp; dwThreadId );
if( m_hThreadHeartbeat == NULL )
break; >
// Todo creado correctamente, devuelve VERDADERO
devuelve VERDADERO
}