Podczas iteracji przez deskryptory plików gniazd, jak mogę sprawdzić, czy któreś z nich pochodzi z pasywnego gniazda (nasłuchiwanie połączeń)?Sprawdź, czy gniazdo nasłuchuje w C
Odpowiedz
Można to sprawdzić za pomocą getsockopt (SO_ACCEPTCONN). Na przykład:
#include <sys/socket.h>
int val;
socklen_t len = sizeof(val);
if (getsockopt(fd, SOL_SOCKET, SO_ACCEPTCONN, &val, &len) == -1)
printf("fd %d is not a socket\n", fd);
else if (val)
printf("fd %d is a listening socket\n", fd);
else
printf("fd %d is a non-listening socket\n", fd);
Naprawdę nie możesz powiedzieć. Musisz sam to sprawdzić, a kiedy chcesz sprawdzić, czy gniazdo jest gniazdem nasłuchowym, porównaj je z tym, które zapisałeś.
można uruchomić w wierszu poleceń (w środowisku Mac/Linux):
lsof -i
i/lub (Linux/Mac/Windows środowisko)
netstat -a
Poprosił o rozwiązanie C (nie ja byłem w dół). – peterh
Ściśle mówiąc, można spróbuj wykonać operację na gnieździe, która przypadkowo określi, jaki rodzaj gniazda jest, np. próbując zaakceptować połączenie z niego. Jeśli accept()
zawiedzie z EINVAL, to całkiem dobry znak, że nie słucha. :)
Śledzenie, które gniazda są lepsze rozwiązanie. Jeśli nie budujesz naprawdę trywialnej aplikacji, prawdopodobnie będziesz musiał zachować jakieś dodatkowe dane na każdym z gniazd.
- 1. Sprawdź, czy gniazdo jest zamknięte w bashu?
- 2. Python: Wyświetlaj komunikat "Oczekiwanie na odtwarzacz ...", a gniazdo nasłuchuje połączenia
- 3. jak zmienić gniazdo boost :: asio w gniazdo C++/CLI .Net?
- 4. C++ Sprawdź, czy element istnieje w tablicy
- 5. Sprawdź, czy obraz istnieje w C#
- 6. Sprawdź, czy element znaleziony w tablicy C++
- 7. Czy connect() blokuje gniazdo TCP?
- 8. C# Sprawdź, czy uruchomić jako administrator
- 9. Gniazdo nasłuchiwania w wątku python
- 10. C# Sprawdź, czy zdałeś argumenty lub nie
- 11. Gniazdo C++ zamykające pierwszą próbę połączenia
- 12. Najszybszy sposób sprawdzenia, czy punkt końcowy WCF nasłuchuje
- 13. Sprawdź inf - cel c
- 14. Objective-C - sprawdź blok?
- 15. C++ wysyła plik i tekst przez gniazdo
- 16. Sprawdź, czy istnieje tabela, jeśli instrukcja w C#?
- 17. Sprawdź, czy istnieje DataRow według nazwy kolumny w C#?
- 18. Sprawdź, czy użytkownik wpisuje literę lub numer w C
- 19. C# Sprawdź, czy ciąg zawiera jakiekolwiek dopasowania w tablicy łańcuchowej
- 20. Sprawdź, czy wartość znajduje się w tablicy (C#)
- 21. Sprawdź, czy przesłany plik jest obraz w C# ASP.NET MVC
- 22. Sprawdź, czy funkcja jest w języku C lub Lua zaimplementowana
- 23. Sprawdź, czy liczba jest liczbą pierwszą podczas kompilacji w C++
- 24. Gniazdo UDP w zespole internetowym
- 25. Sprawdź, czy data w przeszłości
- 26. Najlepszy sposób na przesyłanie wideo przez gniazdo TCP w C
- 27. Napisz do klienta UDP Gniazdo w Go
- 28. Wyjątkowe gniazdo Android "Gniazdo jest zamknięte"
- 29. Sprawdź, czy znak istnieje w kodowaniu
- 30. Jak sprawdzić, czy gniazdo JZMQ jest podłączone?
Tak, myślałem tylko o dołączeniu go do zestawu deskryptorów plików i użycie go w celu sprawdzenia. Dziękuję za Twoją odpowiedź! –
'getsockopt (SOL_SOCKET, SO_ACCEPTCONN)' jest poprawnym sposobem sprawdzenia gniazda do słuchania. Zamiast tego powinieneś przyjąć odpowiedź mark4o. –
@RemyLebeau Nie wiedziałem tego. Chociaż może to być więcej kodu, ale lepiej pasuje do pytania OP. –