Red de conocimiento informático - Conocimiento del nombre de dominio - Cómo saber si el socket se conectó correctamente o falló después de conectarse en modo asíncrono

Cómo saber si el socket se conectó correctamente o falló después de conectarse en modo asíncrono

m_strServerIP = strServerIP;

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 )

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

// 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

m_hThreadHeartbeat = CreateThread( NULL, 0, ThreadProc_Heartbeat, this, 0, amp; dwThreadId );

if( m_hThreadHeartbeat == NULL )

break; >

// Todo creado correctamente, devuelve VERDADERO

devuelve VERDADERO

}