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?
risposta
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.
Per bloccare gli zoccoli si usa select. –
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).
- 1. Come verificare se il socket è ancora connesso?
- 2. Come posso verificare se un filehandle è aperto in Perl?
- 3. Webdriver - Come verificare se il browser esiste ancora o è ancora aperto?
- 4. Come verificare se un elemento di selezione è ancora "aperto"/attivo con jquery
- 5. Come verificare se un file è già aperto in C
- 6. Come verificare se un socket è collegato/disconnesso in C#?
- 7. Come sapere se il socket è aperto in PHP?
- 8. Come posso verificare se un IP è attivo in java?
- 9. Come determinare se un file aperto è un socket o una pipe?
- 10. Controlla se un foglio è aperto
- 11. Come verificare se il socket è chiuso in Boost.Asio?
- 12. Come verificare se esiste ancora un ALAsset usando un URL
- 13. Perl come verificare se la matrice è ancora vuota?
- 14. Come verificare se è ancora in modalità shell Vim
- 15. Come posso sapere se un determinato hWnd è ancora valido?
- 16. controllare se un socket del server è aperto sul lato opposto
- 17. Come controllare in PHP, se un socket è ancora connesso, se non ho il gestore di socket?
- 18. Come verificare se un determinato descrittore di file memorizzato in una variabile è ancora valido?
- 19. Come posso verificare se un campo dell'editor CK è vuoto
- 20. Verificare se l'indice elasticsearch è aperto o chiuso
- 21. Come posso verificare se un elemento non è definito?
- 22. Come posso verificare se un valore è un numero?
- 23. Determina se un file è aperto
- 24. Verificare se il socket è in ascolto in C
- 25. Come verificare se un file è già stato aperto (nello stesso processo)
- 26. Come verificare se un file è aperto da un altro processo (Java/Linux)?
- 27. come posso verificare se esiste un file?
- 28. Come posso verificare se un repository è nudo?
- 29. Come posso verificare se un grafico diretto è aciclico?
- 30. Come posso verificare se un JSON è vuoto in NodeJS?
Vuoi dire verificare se il socket è stato chiuso all'altra estremità? –
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