2009-05-12 13 views
7

Ho un app ++ C che utilizza le chiamate di socket standard e voglio sapere se posso dire se un socket è ancora aperto senza inviare o ricevere dati. È possibile effettuare una chiamata affidabile select o ioctlsocket?Come posso verificare se un socket è ancora aperto?

+0

Vuoi dire verificare se il socket è stato chiuso all'altra estremità? –

+0

Sì. La mia app funziona su Windows e se il PC è ibernato, quando restituisce il socket potrebbe non essere più valido poiché l'altra estremità lo ha chiuso (e poiché la mia app è sospesa, non ricevo alcuna notifica). – Rob

risposta

7

Se si tenta di ricevere un byte, è possibile ricevere diversi errori, se si desidera disporre di un socket non bloccante e provare a ricevere una connessione valida, verrà visualizzato l'errore WSAEWOULDBLOCK.

Sapendo questo siamo in grado di controllare un socket non bloccante in questo modo

bool connected(SOCKET sock) 
{ 
    char buf; 
    int err = recv(sock, &buf, 1, MSG_PEEK); 
    if(err == SOCKET_ERROR) 
    { 
      if(WSAGetLastError() != WSAEWOULDBLOCK) 
      {return false;} 
    } 
    return true; 
} 

come si può vedere dalla return value of recv recv può restituire un timeout o più altri errori di disconnessione, i belive WSAEWOULDBLOCK è l'unico valore che può torna se c'è stato un errore ma è ancora connesso, ma potresti voler ricontrollare l'elenco dei valori di ritorno. Anche la bandiera usata a recv (MSG_PEEK) significa che i dati sono ancora in grado di leggere, quando si va a guardare più tardi, dopo il controllo, in modo che non c'è bisogno di preoccuparsi di perdere un byte di dati.

ritengo questo sarà solo funzionare bene con socket non bloccante, in quanto può bloccare finché riceve dati. Se si desidera utilizzare la presa di blocco, si consiglia di impostarla non bloccata con ioctlsocket prima di questo controllo, quindi restituirla come era.

+0

Per bloccare gli zoccoli si usa select. –

3

Una presa di essere "aperto" non ti aiuterà con la connettività end-to-end. L'unico modo per sapere con certezza che è possibile comunicare con l'altra estremità è, beh, comunicare con l'altra estremità.

In qualsiasi protocollo si progetta, si dovrebbe pensare a implementare questo comportamento controllo. Se non è il tuo protocollo, a volte ci sono modi per farlo in modo subdolo (ad esempio FTP su un file molto piccolo e inutile per verificare se entrambe le porte FTP sono ancora aperte).

Problemi correlati