Jak mogę sprawdzić, czy port TCP jest otwarty, czy nie? [Zamknięte]

9

Usiłuję zaimplementować programowanie gniazd w C. Gdy próbuję połączyć się z klientem do serwera (Ubuntu), pojawia się błąd „połączenie nie powiodło się”.

Myślę więc, że problem dotyczy portu. Korzystam z portu 5454 / tcp do programowania gniazd.

Skąd mam wiedzieć, czy port 5454 nasłuchuje, czy nie? Jeśli nie, to jakich portów mogę użyć do programowania gniazd TCP za pomocą C w Ubuntu? Czy to jest problem tylko z portem, czy coś jest nie tak z moim kodem, czy wymagane są jakieś ustawienia w Linuksie Ubuntu?

EDYCJA: Fragment kodu:

  int socket_send;
   struct sockaddr_in address;
printf("\n Initialization Socket....");

socket_send = socket(AF_INET,SOCK_STREAM,0);
if(socket_send == -1)
{
    perror("\n Socket not created.Error:");
    return 1;
}
printf("\n Socket created");

address.sin_family=AF_INET;
address.sin_addr.s_addr=inet_addr(ip);
address.sin_port=htons(5454);

if(connect(socket_send,(struct sockaddr*)&address,sizeof(struct sockaddr))<0)
{
    perror("\nConnetion failed.Error:");
    return 1;
}
printf("\n Connected");

if(send(socket_send,(char*)buffer,size,flag)<0)
{
    perror("\nSending failed.Error:");
    return 1;
}
printf("\n Data successfully sent");
 close(socket_send);

EDYCJA : Problem jest w porcie, więc właśnie zainstalowałem Ubuntu i działa. Dziękuję wam wszystkim.

dxr
źródło
najpierw port 5454 powinien nasłuchiwać, następnie łączysz się. następnie sprawdź zaporę ogniową.
PersianGulf
Zawsze próbuję lsof -i:5454(może być konieczne wykonanie go jako ten sam użytkownik, co program otwierający port lub jako root).
Carlos Campderrós
gdzie jest kod serwera (lub czy serwer jest istniejącym programem) Pamiętaj, że jeśli chcesz uruchomić fałszywy serwer, nc (netcat) jest twoim przyjacielem.
Foon

Odpowiedzi:

10

Ponieważ programujesz w CI pomyślałem o opublikowaniu małego fragmentu, który pokazuje, czy port jest otwarty, czy nie, zaprogramowałem, aby wyprowadzał ciąg. Możesz go łatwo zmienić w zależności od potrzeb.

Odpowiedz na drugie pytanie, jak wszyscy tutaj mówili, możesz w zasadzie korzystać z dowolnego portu, jeśli jesteś superużytkownikiem (root) w systemie, jeśli port nie jest używany przez żadną inną aplikację. Jeśli nie jesteś rootem, możesz otworzyć dowolny port powyżej 1024.

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h> 


int main(int argc, char *argv[])
{
    int portno     = 5454;
    char *hostname = "192.168.56.101";

    int sockfd;
    struct sockaddr_in serv_addr;
    struct hostent *server;

    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd < 0) {
        error("ERROR opening socket");
    }

    server = gethostbyname(hostname);

    if (server == NULL) {
        fprintf(stderr,"ERROR, no such host\n");
        exit(0);
    }

    bzero((char *) &serv_addr, sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    bcopy((char *)server->h_addr, 
         (char *)&serv_addr.sin_addr.s_addr,
         server->h_length);

    serv_addr.sin_port = htons(portno);
    if (connect(sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0) {
        printf("Port is closed");
    } else {
        printf("Port is active");
    }

    close(sockfd);
    return 0;
}
Purinda Gunasekara
źródło
Świetny! sposób sprawdzenia statusu portów za pomocą C.
Valentin Bajrami
Uwielbiam wzmiankę „mały fragment” ^^. Ale +1 za bardzo pouczający fragment.
Olivier Dulac
Uwaga: w przypadku, gdy ten kod działa równolegle z innymi wątkami, które mogą powodować nowe procesy fork (), należy upewnić się, że deskryptor pliku gniazda jest poprawnie zamknięty, określając SOCK_CLOEXECdla socket()wywołania.
Ton van den Heuvel
5

Istnieje kilka sposobów, najprawdopodobniej najczęściej:

# netstat -ltun

Możesz oczywiście użyć grepinnego (regularnego) wyrażenia.

Jeśli używasz różnych maszyn (klienta i serwera), musisz również sprawdzić iptables.

Możesz używać praktycznie dowolnego portu, który nie jest aktualnie używany dla twoich programów. Sprawdź jednak /etc/servicesznane i zarezerwowane porty.

dawud
źródło
Możesz bezpośrednio wyświetlić listę portów tcp / udp w stanie nasłuchiwania za pomocą polecenia „netstat -ltun”
dsmsk80 27.09.13
kiedy użyłem netstat -an | grep LISTEN Tam pokazano tylko dwa protokoły TCP, a reszta to porty UDP. Teraz, jeśli chcę aktywny port 5454, to jak aktywować?
dxr
@ dsmsk80 ah, tak naprawdę wydaje mi się, że złe nawyki umierają ciężko. Poprawione
dawud
1

Sprawdź łącze ( http://wi-fizzle.com/article/458 ), czy port TCP jest otwarty, czy nie

nc -z <host_or_ip> <port> 1>/dev/null 2>&1; result=$?;

if [ $result -eq 0 ]; then
    echo 'the port is open for tcp connections'
else
    echo 'the port was closed'
fi
Saravanan
źródło
1

Użyj polecenia:

nmap 192.168.56.101

Spowoduje to liczbę portów otwartych na tym komputerze wraz z nazwą usług

SHW
źródło
Używanie czegokolwiek poza nmaptym do bicia wokół buszu IMHO. Aby sprawdzić pojedynczy port, powinieneś użyć nmap -p5454 192.168.56.101.
jwg
To tylko odpowiada tytuł, ale nie odpowiada na rzeczywiste pytanie.
JZeolla,
Tak. Właśnie pokazywałem kierunek. Musi iść, aby uzyskać pożądaną odpowiedź. :)
SHW
1

Najlepszym narzędziem do próby ustalenia, czy proces jest powiązany z portem TCP, jest netstat. Możesz uruchomić go w taki sposób, aby uzyskać listę nazw związanych procesów, jeśli są powiązane, a także wszelkich połączeń z portem, a także ich stanu.

Przykład

$ netstat -tapn | head -15
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name   
tcp        0      0 0.0.0.0:49006               0.0.0.0:*                   LISTEN      -                   
tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LISTEN      -                   
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      -                   
tcp        0      0 127.0.0.1:631               0.0.0.0:*                   LISTEN      -                   
tcp        0      0 0.0.0.0:17500               0.0.0.0:*                   LISTEN      3516/dropbox        
tcp        0      0 0.0.0.0:17501               0.0.0.0:*                   LISTEN      3517/dropbox        
tcp        0      0 0.0.0.0:2143                0.0.0.0:*                   LISTEN      4383/ssh            
tcp        0      0 127.0.0.1:1986              0.0.0.0:*                   LISTEN      2757/mono           
tcp        0      0 0.0.0.0:2025                0.0.0.0:*                   LISTEN      4383/ssh            
tcp        0      0 192.168.1.20:58285          198.252.206.25:80           TIME_WAIT   -                   
tcp        0      0 192.168.1.20:58188          198.252.206.25:80           ESTABLISHED 3830/chrome --purge 
tcp        0      0 192.168.1.20:58286          198.252.206.25:80           TIME_WAIT   -                   
tcp        0      0 192.168.1.20:54000          174.37.23.130:6667          ESTABLISHED 2696/pidgin         

Powyżej pokazuje lokalnie otwarte porty w trzeciej kolumnie i porty zdalne, do których jesteśmy gotowi akceptować połączenia, na przykład za pomocą tych 2 linii:

tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      -                   
tcp        0      0 127.0.0.1:631               0.0.0.0:*                   LISTEN      -                   

Te 2 wiersze pokazują, że nasłuchujemy na porcie 22 (sshd) i jesteśmy gotowi zaakceptować połączenia z dowolnego interfejsu, który mamy (tj. Z dowolnej karty sieciowej, ethernetowej lub bezprzewodowej). Obecnie nie ma połączeń z tym portem.

Drugi wiersz pokazuje, że uruchamiamy serwer CUPS (do drukowania) na porcie 631 i możemy się z nim połączyć tylko przez interfejs localhost (127.0.0.1).

Dalej mamy te 2 linie:

tcp        0      0 192.168.1.20:58285          198.252.206.25:80           TIME_WAIT   -                   
tcp        0      0 192.168.1.20:58188          198.252.206.25:80           ESTABLISHED 3830/chrome --purge 

Które pokazują, że uzyskujemy dostęp do strony internetowej pod adresem IP 198.252.206.25. Wiemy, że jest to witryna internetowa, ponieważ uzyskujemy dostęp do tego serwera przez port 80 (HTTP). Ponadto, jeśli sprawdzimy adres IP, znajdziemy to:

$ dig -x 198.252.206.25 +short
stackoverflow.com.
slm
źródło