Mam aplikację C++, która używa standardowych wywołań gniazd i chcę wiedzieć, czy mogę stwierdzić, czy gniazdo jest nadal otwarte, bez wysyłania lub odbierania jakichkolwiek danych. Czy mogę wykonać niezawodny telefon select
lub ioctlsocket
?Jak mogę sprawdzić, czy gniazdo jest nadal otwarte?
Odpowiedz
Jeśli spróbujesz odebrać jeden bajt, możesz otrzymać kilka błędów, jeśli masz gniazdo bez blokady i spróbować odebrać poprawne połączenie, otrzymasz błąd WSAEWOULDBLOCK.
Wiedząc o tym możemy sprawdzić non gniazdo blokady Podobnie jak
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;
}
jak widać z return value of recv recv może powrócić timeout lub kilka innych błędów dla rozłączenia, wierzę WSAEWOULDBLOCK jest jedyną wartością może ona return, jeśli wystąpił błąd, ale nadal jest podłączony, ale możesz dwukrotnie sprawdzić listę zwracanych wartości. Również flaga używana w recv (MSG_PEEK) oznacza, że dane są nadal w stanie odczytać, kiedy przejdziesz później, po sprawdzeniu, więc nie musisz się martwić o utratę jednego bajtu danych.
Wierzę, że to będzie działać dobrze tylko z nieblokującymi gniazdami, ponieważ może blokować, dopóki nie otrzyma danych. Jeśli chcesz użyć gniazda blokującego, przed jego sprawdzeniem możesz ustawić je jako niezablokowane przy użyciu ioctlsocket, a następnie przywrócić je do stanu, w którym się on znajdował.
Do blokowania gniazd używaj select. –
Gniazdo "otwarte" nie pomaga w łączeniu typu end-to-end. Jedynym sposobem, by wiedzieć na pewno, że możesz komunikować się z drugim końcem, jest porozumiewanie się z drugim końcem.
W każdym opracowanym protokole powinieneś pomyśleć o wprowadzeniu tego zachowania sprawdzającego. Jeśli nie jest to twój protokół, czasami można to zrobić podstępnie (na przykład FTP w bardzo małym, bezużytecznym pliku, aby sprawdzić, czy porty FTP są nadal otwarte).
- 1. Jak sprawdzić, czy gniazdo jest otwarte w PHP?
- 2. Jak sprawdzić, czy gniazdo JZMQ jest podłączone?
- 3. Jak mogę sprawdzić, czy mój kontekst jest nadal ważny?
- 4. Jak sprawdzić, czy okno dialogowe jquery jest otwarte?
- 5. Perl - przekazując otwarte gniazdo całej widelcem/exec
- 6. Brak procesu Unicorn/Nginx, gniazdo otwarte
- 7. Jak sprawdzić, czy jest nadal w trybie powłoki Vima
- 8. Python - jak sprawdzić, czy słaba referencja jest nadal dostępna
- 9. jak sprawdzić, czy aktywność jest nadal w stosie?
- 10. ActionController :: LIve Czy można sprawdzić, czy połączenie jest nadal aktywne?
- 11. Webdriver - Jak sprawdzić, czy przeglądarka nadal istnieje czy nadal jest otwarta?
- 12. Jak mogę sprawdzić, czy kolejka jest pusta?
- 13. Jak mogę sprawdzić, czy funkcja jest częściowa?
- 14. Jak mogę sprawdzić, czy Dispatcher.DisableProcessing jest aktywny?
- 15. Jak mogę sprawdzić, czy scenarzysta jest zamknięty?
- 16. Jak mogę sprawdzić, czy wartość jest liczbą?
- 17. Powiązania Python AppIndicator -> howto sprawdzić, czy menu jest otwarte?
- 18. Sprawdź, czy gniazdo jest zamknięte w bashu?
- 19. Jak sprawdzić, czy żądania HTTP są otwarte w przeglądarce?
- 20. Jak sprawdzić, czy gniazdo jest zamknięte, czy nie w bibliotece luasocket?
- 21. Jak mogę potwierdzić, że okno przeglądarki jest otwarte, z Javascriptem?
- 22. Jak sprawdzić, czy plik nadal istnieje przy użyciu deskryptora pliku
- 23. Jak sprawdzić, czy zdalny system jest osiągalny?
- 24. Jak mogę uzyskać nieblokujące gniazdo connect()?
- 25. Jak mogę sprawdzić, czy instancja twisted.internet.protocol rozłączył
- 26. Wyjątkowe gniazdo Android "Gniazdo jest zamknięte"
- 27. Czy rmic jest nadal potrzebny?
- 28. Czy COM + jest nadal zalecany?
- 29. Czy nadal potrzebny jest ActionBarSherlock?
- 30. SignalR - Sprawdzanie, czy użytkownik jest nadal podłączony
Czy masz na myśli sprawdzenie, czy gniazdo zostało zamknięte na drugim końcu? –
Tak. Moja aplikacja działa w systemie Windows i jeśli komputer jest hibernowany, po jego powrocie gniazdo może przestać być poprawne, ponieważ drugi koniec je zamknął (a ponieważ moja aplikacja jest zawieszona, nie otrzymuję powiadomienia). – Rob