2012-04-21 10 views

Odpowiedz

21

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); 
-1

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ś.

+0

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ź! –

+2

'getsockopt (SOL_SOCKET, SO_ACCEPTCONN)' jest poprawnym sposobem sprawdzenia gniazda do słuchania. Zamiast tego powinieneś przyjąć odpowiedź mark4o. –

+0

@RemyLebeau Nie wiedziałem tego. Chociaż może to być więcej kodu, ale lepiej pasuje do pytania OP. –

-1

można uruchomić w wierszu poleceń (w środowisku Mac/Linux):

lsof -i 

i/lub (Linux/Mac/Windows środowisko)

netstat -a 
+0

Poprosił o rozwiązanie C (nie ja byłem w dół). – peterh

0

Ś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.

Powiązane problemy