To zależy od dokładnie tego, co próbujesz przetestować.
Używanie bind()
w sposób zaproponowany przez joelc powie Ci, czy port jest otwarty na dowolnym interfejsie na twoim komputerze. Chociaż należy dokładnie sprawdzić nie tylko wartość zwracaną z bind()
, ale także sprawdzanie errno == EADDRINUSE
.
tj. (modyfikacja kodu joelc)
if(bind(socket, (struct sockaddr *)&sin,sizeof(struct sockaddr_in)) == -1)
{
if(errno == EADDRINUSE)
{
// handle port already open case
}
else
{
// handle other errors
}
}
Zmieniając adres używany w linii: np.
sin.sin_addr.s_addr = inet_addr("192.168.1.1");
... możesz sprawdzić, czy port jest dostępny w określonym interfejsie.
Należy jednak pamiętać, że nie jest to doskonały test dla stanu portu. Jeśli inny proces miał otwarty port i został zakończony, zanim zamknie go z wdziękiem (tj. Przed wywołaniem close()
na gnieździe), zazwyczaj otrzymasz ten sam błąd EADDRINUSE
. (w zależności od tego, czy opcja SO_REUSEADDR został ustawiony na gnieździe)
(strona UWAGA: chyba że aplikacja jest uruchomiona Test z wystarczającymi uprawnieniami nie będzie w stanie związać() do wszelkich portów poniżej 1024)
Zgodnie z sugestią Anonymous, możesz również rzucić okiem na netstat
. To da ci wszystkie te same informacje, które możesz uzyskać, wielokrotnie wywołując bind()
znacznie szybciej i bez żadnych efektów ubocznych (jak to, że nie musi faktycznie wiązać się z portami, co uczyniłoby je bezużytecznymi dla jakichkolwiek innych procesów). Po prostu wywołanie netstat -a --numeric-ports -t
i analizowanie danych wyjściowych powinno dać ci wszystko, czego szukasz.
Uwaga na sugestię moogów - wywołanie telnetu na każdym porcie powie ci tylko, czy gniazdo nasłuchuje na tym porcie - nie, czy faktycznie jest otwarte.
Czy to zadanie domowe? –