yo detecto la desconexion usando socket asíncronos, lo detecto al usar recv
ulong ReadSZ = 0;
wsock->Ioctlsocket(hSocket,FIONREAD,&ReadSZ);
if(ReadSZ){
//Se recibieron datos
//Codigo de recv
return ReadSZ;
}else{
//No hay datos
ReadSZ = wsock->Recv(hSocket,0,0,MSG_PEEK);
if(!(ReadSZ+1)){
//A habido un error
switch(wsock->WsaGetLastError()){
case WSAEWOULDBLOCK:
break;
case WSAECONNRESET:
//Se cerro la conexion
default:
//errror
return -1;
}
}else{
//Se cerro la conexion
return -1;
}
}
La cosa es que si ReadSZ es zero no hay datos para leer, y al usar rcv si la conexio se cierra bien da 0 y si se cierra mal da SOCKET_ERROR y LastError = WSAECONNRESET.