¿Cómo determinar si el SOCKET todavía está conectado?
// Determinar si conectar
char ch = 'A';
if (read(g_sockfd, &ch, 1)<=0) p >
{
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;
}
}