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

9

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

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

Wie kann ich feststellen, ob der 5454-Port empfangsbereit ist oder nicht? Wenn nicht, welche Ports kann ich dann für die TCP-Socket-Programmierung mit C in Ubuntu verwenden? Ist das das Problem nur mit dem Port oder ist etwas in meinem Code falsch oder sind Einstellungen in LINUX Ubuntu erforderlich?

EDIT: Codeausschnitt:

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

EDIT : Das Problem liegt im Port, also habe ich Ubuntu gerade neu installiert und es funktioniert. Danke euch allen.

dxr
quelle
Zuerst sollte Port 5454 den Abhörstatus haben. Dann stellen Sie eine Verbindung her. Überprüfen Sie anschließend Ihre Firewall.
PersianGulf
Ich versuche es immer lsof -i:5454(möglicherweise müssen Sie es als denselben Benutzer ausführen, den das Programm, das den Port öffnet, oder als Root ausführt).
Carlos Campderrós
Wo ist der Servercode (oder ist der Server ein vorhandenes Programm)? Beachten Sie, dass nc (netcat) Ihr Freund ist, wenn Sie einen Dummy-Server ausführen möchten.
Foon

Antworten:

10

Da Sie in CI programmieren und daran gedacht haben, ein kleines Snippet zu veröffentlichen, das Ihnen zeigt, ob der Port offen ist oder nicht, habe ich die Ausgabe eines Strings programmiert. Sie können es leicht an Ihre Bedürfnisse anpassen.

Antwort auf Ihre zweite Frage, wie alle hier sagten, können Sie so ziemlich jeden Port verwenden, wenn Sie der Superuser (Root) auf dem System sind, wenn der Port von keiner anderen Anwendung verwendet wird. Wenn Sie nicht der Root sind, können Sie einen beliebigen 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;
}
Purinda Gunasekara
quelle
Ausgezeichnet! Möglichkeit, den Status eines Ports mit C. zu überprüfen
Valentin Bajrami
Ich liebe die Erwähnung "ein kleiner Ausschnitt" ^^. Aber +1 für einen sehr informativen Ausschnitt.
Olivier Dulac
Beachten Sie, dass für den Fall, dass dieser Code gleichzeitig mit anderen Threads ausgeführt wird, die möglicherweise fork () neue Prozesse ermöglichen, sichergestellt werden muss, dass der Socket-Dateideskriptor ordnungsgemäß geschlossen wird, indem SOCK_CLOEXECfür den socket()Aufruf angegeben wird.
Ton van den Heuvel
5

Es gibt verschiedene Möglichkeiten, die wahrscheinlich häufigste:

# netstat -ltun

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

Wenn Sie verschiedene Computer (Client und Server) verwenden, müssen Sie dies ebenfalls überprüfen iptables.

Sie können so ziemlich jeden Port verwenden, der derzeit nicht für Ihre Programme verwendet wird. Suchen Sie jedoch /etc/servicesnach bekannten und reservierten Ports.

dawud
quelle
Sie können TCP / UDP-Ports direkt im Listen-Status mit "netstat -ltun"
dsmsk80
als ich netstat -an | verwendet habe grep LISTEN Dort werden nur zwei TCP-Prots angezeigt und der Rest sind UDP-Ports. Wenn ich nun den 5454-Port aktivieren möchte, wie soll ich dann aktiv werden?
dxr
@ dsmsk80 ah, in der Tat, ich denke, schlechte Gewohnheiten sterben schwer. Korrigiert.
Dawud
1

Überprüfen Sie, ob der Link ( http://wi-fizzle.com/article/458 ) für den TCP-Port 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
Saravanan
quelle
1

Verwenden Sie den Befehl:

nmap 192.168.56.101

Daraus ergibt sich die Anzahl der auf diesem Computer geöffneten Ports sowie der Name der Dienste

SHW
quelle
Alles andere als nmapdafür zu benutzen, ist meiner Meinung nach um den heißen Brei. Um einen einzelnen Port zu überprüfen, sollten Sie verwenden nmap -p5454 192.168.56.101.
JWG
Dies beantwortet nur den Titel, aber nicht die eigentliche Frage.
JZeolla
Ja. Ich habe nur die Richtung gezeigt. Er muss gehen, um die gewünschte Antwort zu erhalten. :)
SHW
1

Das beste Tool, um festzustellen, ob ein Prozess an einen TCP-Port gebunden ist, ist netstat. Sie können es so ausführen, um eine Liste des Namens des Prozesses, der gegebenenfalls gebunden ist, sowie aller Verbindungen zum Port und seines 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         

Das Obige zeigt lokal geöffnete Ports in der 3. Spalte und Remote-Ports, zu denen wir Verbindungen akzeptieren möchten, z. B. mit diesen beiden Leitungen:

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 Port 22 (sshd) abhören und bereit sind, Verbindungen von jeder Schnittstelle zu akzeptieren (dh von jeder Netzwerkkarte, jedem Ethernet oder drahtlosen Netzwerk). Derzeit bestehen keine Verbindungen zu diesem Port.

Die zweite Zeile zeigt, dass der CUPS-Server (zum Drucken) auf Port 631 ausgeführt wird und wir nur über die localhost-Schnittstelle (127.0.0.1) eine Verbindung zu ihm 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 

Welche zeigen, dass wir auf eine Website unter der IP-Adresse 198.252.206.25 zugreifen. Wir wissen, dass es sich um eine Website handelt, da wir über Port 80 (HTTP) auf diesen Server zugreifen. Auch wenn wir die IP-Adresse nachschlagen, finden wir Folgendes:

$ dig -x 198.252.206.25 +short
stackoverflow.com.
slm
quelle