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.
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).Réponses:
É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.
la source
SOCK_CLOEXEC
pour l'socket()
appel.Il existe plusieurs façons, la plus courante étant probablement:
Vous pouvez, bien sûr,
grep
pour 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/services
ports connus et réservés.la source
Vérifiez que le lien ( http://wi-fizzle.com/article/458 ) pour le port TCP est ouvert ou non
la source
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
la source
nmap
pour cela tourne autour du pot à mon humble avis. Pour vérifier un seul port, vous devez utilisernmap -p5454 192.168.56.101
.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
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:
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:
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:
la source