Petit serveur en C : pblm de port
Résolu
Sophie
-
totof31 Messages postés 163 Date d'inscription Statut Membre Dernière intervention -
totof31 Messages postés 163 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
Dans le pgme ci dessous, j'essaye de faire un petit serveur : il se
bloque sur accept et dès qu'il reçoit un client, il quitte.
Néanmoins, je remarque qu'au début il prend bien le port que je lui
indique à savoir 55555 (pour le bind). Quand il reçoit un client
(telnet localhost 55555), il sort mais lors de l'exécution suivante il
prend un autre port (vérification avec netstat -ltn et en plus le
telnet localhost 55555 ne marche plus).
Pour qu'il utilise à nouveau le port 55555, je dois attendre qqs minutes pour le relancer.
Du coup, je ne comprends pas grand chose, auriez vous une idee sur ça svp ?
Merci !
#include <iostream>
#include <arpa/inet.h>
#include <errno.h>
int main()
{
int server = socket(AF_INET, SOCK_STREAM,0);
sockaddr_in sockaddr_serveur;
sockaddr_serveur.sin_port = htons (55555);
in_addr addr ; inet_aton("127.0.0.1", &addr);
sockaddr_serveur.sin_addr = addr;
sockaddr_serveur.sin_family = AF_INET;
bind (server, (struct sockaddr *) &sockaddr_serveur, sizeof(struct sockaddr ));
listen(server, 20);
sockaddr_in addr_client;
socklen_t size;
int soc_client = accept(server, (struct sockaddr *)&addr_client, &size);
close(soc_client);
close(server) ;
return 1;
}
Dans le pgme ci dessous, j'essaye de faire un petit serveur : il se
bloque sur accept et dès qu'il reçoit un client, il quitte.
Néanmoins, je remarque qu'au début il prend bien le port que je lui
indique à savoir 55555 (pour le bind). Quand il reçoit un client
(telnet localhost 55555), il sort mais lors de l'exécution suivante il
prend un autre port (vérification avec netstat -ltn et en plus le
telnet localhost 55555 ne marche plus).
Pour qu'il utilise à nouveau le port 55555, je dois attendre qqs minutes pour le relancer.
Du coup, je ne comprends pas grand chose, auriez vous une idee sur ça svp ?
Merci !
#include <iostream>
#include <arpa/inet.h>
#include <errno.h>
int main()
{
int server = socket(AF_INET, SOCK_STREAM,0);
sockaddr_in sockaddr_serveur;
sockaddr_serveur.sin_port = htons (55555);
in_addr addr ; inet_aton("127.0.0.1", &addr);
sockaddr_serveur.sin_addr = addr;
sockaddr_serveur.sin_family = AF_INET;
bind (server, (struct sockaddr *) &sockaddr_serveur, sizeof(struct sockaddr ));
listen(server, 20);
sockaddr_in addr_client;
socklen_t size;
int soc_client = accept(server, (struct sockaddr *)&addr_client, &size);
close(soc_client);
close(server) ;
return 1;
}
A voir également:
- Petit serveur en C : pblm de port
- Changer serveur dns - Guide
- Petit 1 comme ² ✓ - Forum Windows
- Comment imprimer une photo en petit ✓ - Forum Photo numérique
- Serveur dns gratuit - Guide
- Serveur entrant et sortant - Guide
3 réponses
Bonjour,
Merci char sipper pour tes conseils.
Merci totof31 pour ta réponse. Effectivement, c'est lié à ce que tu as dit.
En effet, quand j'arrête le serveur, je vois la socket associé dans un état TIME-WAIT avec netstat -tn. Elle disparait après quelques minutes.
J'ai contourné ce problème en utilisant en utilisant SO_REUSEADDR comme tu l'as dit :
int yes = 1;
setsockopt(sock_serveur, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int));
Donc c'est réglé !
Merci :)
Merci
Merci char sipper pour tes conseils.
Merci totof31 pour ta réponse. Effectivement, c'est lié à ce que tu as dit.
En effet, quand j'arrête le serveur, je vois la socket associé dans un état TIME-WAIT avec netstat -tn. Elle disparait après quelques minutes.
J'ai contourné ce problème en utilisant en utilisant SO_REUSEADDR comme tu l'as dit :
int yes = 1;
setsockopt(sock_serveur, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int));
Donc c'est réglé !
Merci :)
Merci
totof31
Messages postés
163
Date d'inscription
Statut
Membre
Dernière intervention
74
Avec plaisir, et merci pour le retour !
Salut.
ton programme semble juste, mais ils n'est pas sécurisé. En effet la plupart des fonctions retournent des valeur d'erreurs dans le cas où ça se passe mal.
Complète ton programme en testant chaque valeur de retour, une fonction tel que bond doit rencontrer une erreur, ensuite en regardant errno tu sauras quoi.
ton programme semble juste, mais ils n'est pas sécurisé. En effet la plupart des fonctions retournent des valeur d'erreurs dans le cas où ça se passe mal.
Complète ton programme en testant chaque valeur de retour, une fonction tel que bond doit rencontrer une erreur, ensuite en regardant errno tu sauras quoi.