Wie kann ich feststellen, ob ein TCP-Port geöffnet ist oder nicht?

Wie kann ich feststellen, ob ein TCP-Port geöffnet ist oder nicht?

Ich versuche, Socket-Programmierung in C zu implementieren. Wenn ich versuche, von einem Client aus eine Verbindung zu einem Server (Ubuntu) herzustellen, wird ein Fehler wie „Verbindung fehlgeschlagen“ angezeigt.

Ich denke also, dass das Problem am Port liegt. Ich verwende den Port 5454/TCP für die Socket-Programmierung.

Wie kann ich feststellen, ob Port 5454 lauscht oder nicht? Wenn nicht, welche Ports kann ich dann für die TCP-Socket-Programmierung mit C in Ubuntu verwenden? Liegt das Problem nur am Port, oder stimmt etwas in meinem Code nicht, oder sind in LINUX Ubuntu irgendwelche Einstellungen erforderlich?

BEARBEITEN: Code-Schnipsel:

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

BEARBEITEN: Das Problem liegt am Port, also habe ich Ubuntu einfach neu installiert und es funktioniert. Vielen Dank euch allen.

Antwort1

Da Sie in CI programmieren, dachte ich daran, einen kleinen Ausschnitt zu veröffentlichen, der Ihnen zeigt, ob der Port geöffnet ist oder nicht. Ich habe die Ausgabe einer Zeichenfolge programmiert. Sie können diese ganz einfach an Ihre Bedürfnisse anpassen.

Antwort auf Ihre zweite Frage: Wie alle hier gesagt haben, können Sie praktisch jeden Port verwenden, wenn Sie der Superuser (Root) auf dem System sind und der Port nicht von einer anderen Anwendung verwendet wird. Wenn Sie nicht der Root sind, können Sie jeden Port über 1024 öffnen.

#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;
}

Antwort2

Es gibt mehrere Möglichkeiten. Die gebräuchlichste ist wahrscheinlich:

# netstat -ltun

Sie können natürlich auch grepandere (reguläre) Ausdrücke verwenden.

Wenn Sie unterschiedliche Maschinen (Client und Server) verwenden, müssen Sie dies iptablesebenfalls überprüfen.

Sie können praktisch jeden Port verwenden, der derzeit nicht für Ihre Programme verwendet wird. Achten Sie jedoch /etc/servicesauf bekannte und reservierte Ports.

Antwort3

Überprüfen Sie den Link (http://wi-fizzle.com/article/458) für den TCP-Port, ob dieser geöffnet ist oder nicht

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

Antwort4

Das beste Tool, um herauszufinden, ob ein Prozess an einen TCP-Port gebunden ist, ist netstat. Sie können es wie folgt ausführen, um eine Liste mit den Namen der gebundenen Prozesse (sofern vorhanden) sowie mit allen Verbindungen zum Port und deren Status zu erhalten.

Beispiel

$ 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         

Oben sind in der dritten Spalte lokal geöffnete Ports und Remote-Ports aufgeführt, zu denen wir Verbindungen akzeptieren, beispielsweise mit diesen beiden Zeilen:

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      -                   

Diese beiden Zeilen zeigen, dass wir auf Port 22 (sshd) lauschen und bereit sind, Verbindungen von jeder Schnittstelle zu akzeptieren, die wir haben (also jede Netzwerkkarte, Ethernet oder WLAN). Derzeit bestehen keine Verbindungen zu diesem Port.

Die zweite Zeile zeigt, dass wir den CUPS-Server (zum Drucken) auf Port 631 ausführen und nur über die Schnittstelle „localhost“ (127.0.0.1) eine Verbindung dazu herstellen können.

Weiter unten haben wir diese 2 Zeilen:

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 

Das zeigt, dass wir auf eine Website mit der IP-Adresse 198.252.206.25 zugreifen. Wir wissen, dass es sich um eine Website handelt, weil wir über Port 80 (HTTP) auf diesen Server zugreifen. Wenn wir außerdem die IP-Adresse nachschlagen, finden wir Folgendes:

$ dig -x 198.252.206.25 +short
stackoverflow.com.

verwandte Informationen