Comment savoir si un port TCP est ouvert ou non? [fermé]

9

J'essaie d'implémenter la programmation des sockets en C. Lorsque j'essaye de me connecter d'un client à un serveur (Ubuntu), cela montre une erreur comme "la connexion a échoué".

Je pense donc que le problème vient du port. J'utilise le port 5454 / tcp pour la programmation des sockets.

Comment savoir si le port 5454 écoute ou non? Si ce n'est pas le cas, quels sont les ports que je peux utiliser pour la programmation de socket TCP en utilisant C dans Ubuntu? Est-ce le problème avec le port uniquement ou y a-t-il quelque chose qui ne va pas dans mon code ou des paramètres sont-ils nécessaires dans LINUX Ubuntu?

EDIT: extrait de code:

  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 : Le problème est dans le port, donc je viens de réinstaller Ubuntu, et cela fonctionne. Merci à vous tous.

dxr
la source
dans un premier temps, le port 5454 doit écouter l'état, puis vous vous connectez.second vérifier votre pare-feu.
PersianGulf
J'essaie toujours lsof -i:5454(vous devrez peut-être l'exécuter en tant que même utilisateur que le programme ouvrant le port, ou en tant que root).
Carlos Campderrós
où est le code du serveur (ou le serveur est-il un programme existant) Notez que si vous voulez exécuter un serveur factice, nc (netcat) est votre ami.
Foon

Réponses:

10

Étant donné que vous programmez dans CI, j'ai pensé à publier un petit extrait qui vous indique si le port est ouvert ou non, j'ai programmé une sortie de chaîne. Vous pouvez facilement le modifier en fonction de vos besoins.

Répondez à votre deuxième question, comme tout le monde ici l'a dit, vous pouvez à peu près utiliser n'importe quel port si vous êtes le super utilisateur (root) du système si le port n'est utilisé par aucune autre application. Si vous n'êtes pas root, vous pouvez ouvrir n'importe quel port au-dessus de 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
la source
Excellent! moyen de vérifier l'état d'un port en utilisant C.
Valentin Bajrami
J'adore la mention "un petit extrait" ^^. Mais +1 pour un extrait très informatif.
Olivier Dulac
Remarque, dans le cas où ce code s'exécute simultanément avec d'autres threads que de nouveaux processus fork () possibles, il est nécessaire de s'assurer que le descripteur de fichier socket est correctement fermé en spécifiant SOCK_CLOEXECpour l' socket()appel.
Ton van den Heuvel
5

Il existe plusieurs façons, la plus courante étant probablement:

# netstat -ltun

Vous pouvez, bien sûr, greppour une autre expression (régulière).

Si vous utilisez différentes machines (client et serveur), vous devez également vérifier iptables.

Vous pouvez à peu près utiliser n'importe quel port qui n'est pas actuellement utilisé pour vos programmes. Vérifiez cependant les /etc/servicesports connus et réservés.

dawud
la source
Vous pouvez lister directement les ports tcp / udp en état d'écoute avec "netstat -ltun"
dsmsk80
quand j'ai utilisé netstat -an | grep LISTEN Là, il montre seulement deux protos tcp et le reste sont des ports UDP. Maintenant, si je veux activer le port 5454, comment l'activer?
dxr
@ dsmsk80 ah, en effet, je suppose que les mauvaises habitudes ont la vie dure. Corrigée.
dawud
1

Vérifiez que le lien ( http://wi-fizzle.com/article/458 ) pour le port TCP est ouvert ou non

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
la source
1

Utilisez la commande:

nmap 192.168.56.101

Il en résultera le nombre de ports ouverts sur cette machine ainsi que le nom des services

SHW
la source
Utiliser autre chose que nmappour cela tourne autour du pot à mon humble avis. Pour vérifier un seul port, vous devez utiliser nmap -p5454 192.168.56.101.
jwg
Cela ne répond qu'au titre mais ne répond pas à la question réelle.
JZeolla
Oui. Je montrais juste la direction. Il doit marcher pour obtenir la réponse souhaitée. :)
SHW
1

Le meilleur outil pour essayer de déterminer si un processus est lié à un port TCP est netstat. Vous pouvez l'exécuter comme tel pour obtenir une liste du nom du processus lié, le cas échéant, ainsi que des connexions au port, ainsi que leur état.

Exemple

$ 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         

Ce qui précède montre les ports ouverts localement dans la 3e colonne et les ports distants auxquels nous sommes prêts à accepter les connexions, comme avec ces 2 lignes:

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      -                   

Ces 2 lignes montrent que nous écoutons sur le port 22, (sshd) et sommes prêts à accepter les connexions de n'importe quelle interface que nous avons (c'est-à-dire n'importe quelle carte réseau, Ethernet ou sans fil). Il n'y a actuellement aucune connexion à ce port.

La deuxième ligne montre que nous exécutons le serveur CUPS (pour l'impression) sur le port 631, et nous ne pouvons nous y connecter que via l'interface localhost (127.0.0.1).

Plus bas, nous avons ces 2 lignes:

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 

Ce qui montre que nous accédons à un site Web à l'adresse IP 198.252.206.25. Nous savons que c'est un site Web car nous accédons à ce serveur via le port 80 (HTTP). De plus, si nous recherchons l'adresse IP, nous trouvons ceci:

$ dig -x 198.252.206.25 +short
stackoverflow.com.
slm
la source