Petit serveur en C : pblm de port

Résolu/Fermé
Sophie - 20 nov. 2012 à 22:53
totof31 Messages postés 163 Date d'inscription lundi 29 octobre 2012 Statut Membre Dernière intervention 30 avril 2013 - 29 nov. 2012 à 22:49
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;

}

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
1
totof31 Messages postés 163 Date d'inscription lundi 29 octobre 2012 Statut Membre Dernière intervention 30 avril 2013 74
29 nov. 2012 à 22:49
Avec plaisir, et merci pour le retour !
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
21 nov. 2012 à 14:07
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.
0
totof31 Messages postés 163 Date d'inscription lundi 29 octobre 2012 Statut Membre Dernière intervention 30 avril 2013 74
Modifié par totof31 le 21/11/2012 à 17:22
L'attente est normale car c'est l'OS qui gère la fin de connexion TCP, même si tu fais close et que tu fermes ton programme correctement.
Cherche TIME-WAIT pour avoir plus d'infos à ce sujet.
Cherche SO_REUSEADDR sur une façon de contourner le pb.
0