Red de conocimiento informático - Material del sitio web - ¿Cómo determinar si el SOCKET todavía está conectado?

¿Cómo determinar si el SOCKET todavía está conectado?

// Determinar si conectar

char ch = 'A';

if (read(g_sockfd, &ch, 1)<=0)

{

if (connect(g_sockfd,(struct sockaddr*)&g_serv_addr, sizeof(g_serv_addr) ) == 0)

{

ServiceLog .write_log("[NotifyDAU]: conexión exitosa a DAU.");

}

else

{

ServiceLog. write_log ("[NotifyDAU]: no se puede conectar a DAU ");

return;

}

}

Usar try { }catch{} es más apropiado.

Cuando esté conectado, sabrá cuándo ocurre una excepción durante la comunicación.

Cuando continúa leyendo, el servidor se interrumpe y se detecta la excepción.

2. Paquete Heartbeat

¿Puedes configurar un temporizador en el Cliente y enviar un mensaje al servidor de vez en cuando para ver si puedes recibir una respuesta del servidor?

El paquete de latidos se envía periódicamente. Si no hay respuesta, se considerará desconectado.

3.getsockopt

int optval, optlen = sizeof(int);

getsockopt(sd, SOL_SOCKET, SO_ERROR,(char*) &optval, &optlen) ;

switch(optval){

caso 0:

//"En estado de conexión"

interrupción

caso ECONNREFUSED:

caso EHOSTNUMREACH:

}

4 Situación utilizada en el proyecto

// Determinar si se debe conectar

int optval, optlen = sizeof(int);

int r = getsockopt(g_sockfd, SOL_SOCKET, SO_ERROR,(char*) &optval, &optlen);

// enviar paquete HOLA

if ((optval == 0) && (r == 0) && (send(g_sockfd,(char*)&g_DAUCommand,sizeof(struct _DAUCommand),0) ! = SOCKET_ERROR ))

{

ServiceLog.write_log("[threadOperationWaitTrasferAgain]: intenta recibir desde dau...");

length = recv( g_sockfd ,(char *)&command,sizeof(struct _DAUCommand),0);

}

else

{

if ( connect (g_sockfd,(struct sockaddr*)&g_serv_addr, sizeof(g_serv_addr) ) == 0)

{

ServiceLog.write_log("[threadOperationWaitTrasferAgain]: conéctese al éxito de DAU". ) ;

ServiceLog.write_log("[threadOperationWaitTrasferAgain]: intente recibir desde dau...");

length = recv(g_sockfd,(char *)&command,sizeof( struct _DAUCommand),0);

}

else

{

ServiceLog.write_log("[threadOperationWaitTransferAgain]: no se puede conéctese a DAU, intente nuevamente ");

longitud = 0;<

/p>

continuar;

}

}