[Linux C] socket serveur toujours présente quand on relance le prog

socket serveur toujours présente quand on relance le prog [Linux C] - C++ - Programmation

Marsh Posté le 05-05-2003 à 10:34:39    

J'ai une appli de Chat qui fait serveur et un client.
Tout se passe bien, ca marche.
Quand les clients s'en vont, le serveur peut fermer si on le désire et on peut le relancer juste après.
 
Mais, quand je ferme le serveur avant que les clients ne soient partis, je ne peux pas le relancer tout de suite, il faut que j'attende 2 min, sinon il me dit que le Bind est impossible, comme si la socket tournai toujours et écoutait le port.

Reply

Marsh Posté le 05-05-2003 à 10:34:39   

Reply

Marsh Posté le 05-05-2003 à 11:06:35    

c'est normal, ca nous avait fait pareil qd pour l'iut on a fait un serveur HTTP, la seule solution si tu veux utiliser ton serveur c'est de changer de port a chaque redemarrage du serveur (t'en prends 2/3 et tu alternes, genre 1er fois sur 7000, apres le 7001 puis re 7000 etc....)

Reply

Marsh Posté le 05-05-2003 à 11:25:18    

Ca fait un peu bourrin comme méthode, mais c vrai que c probablement ce que je vais faire ;) . C'est louche tout de même cette histoire, j'ai déjà fait la même chose sous windows et ca marche très bien, c pas possible qu'il y ai pas d'autres moyens. Mais bon... Merci a toi ! :)

Reply

Marsh Posté le 05-05-2003 à 11:31:21    

Larry99 a écrit :

Ca fait un peu bourrin comme méthode, mais c vrai que c probablement ce que je vais faire ;) . C'est louche tout de même cette histoire, j'ai déjà fait la même chose sous windows et ca marche très bien, c pas possible qu'il y ai pas d'autres moyens. Mais bon... Merci a toi ! :)


j'ai jamais essayé sous windows (notre serveur devait tourner sous unix :sweat:)
apres c'est vrai que c'est bourrin mais on rien trouvé d'autre comme solution, c'est surement du a linux qui attend un certain laps de temps avant de vraiment libérer la ressource....

Reply

Marsh Posté le 05-05-2003 à 11:38:47    

Bizarre ce truc, tu fermes correctement ta socket au moins ?

Reply

Marsh Posté le 05-05-2003 à 11:41:59    

*Syl* a écrit :

Bizarre ce truc, tu fermes correctement ta socket au moins ?

nous on la fermait, c'est sur......

Reply

Marsh Posté le 05-05-2003 à 11:45:37    

(prend un air dans le style de celui de ++Taz)
Linux ... :sarcastic:
(/air style ++Taz)
 
:whistle:


---------------
last.fm
Reply

Marsh Posté le 05-05-2003 à 12:22:33    

Il ne faut pas seulement fermer la socket, il faut également tuer toutes les connexions établies...


---------------
« No question is too silly to ask, but, of course, some are too silly to answer. » -- Perl book
Reply

Marsh Posté le 05-05-2003 à 13:05:57    

Jar Jar a écrit :

Il ne faut pas seulement fermer la socket, il faut également tuer toutes les connexions établies...

dans le cas de notre serveur http on fermait la connection apres l'envoi de la page, et on etait qd meme obligé de changer le port si on voulait redemarrer le serveur moins de 5 min avant de l'avoir fermé (le serveur hein, pas la connection  :o !)

Reply

Marsh Posté le 05-05-2003 à 13:31:22    

theShOcKwAvE a écrit :

(prend un air dans le style de celui de ++Taz)
Linux ... :sarcastic:
(/air style ++Taz)
 
:whistle:

:D

Reply

Marsh Posté le 05-05-2003 à 13:31:22   

Reply

Marsh Posté le 05-05-2003 à 13:41:58    

harrysauce a écrit :

dans le cas de notre serveur http on fermait la connection apres l'envoi de la page, et on etait qd meme obligé de changer le port si on voulait redemarrer le serveur moins de 5 min avant de l'avoir fermé (le serveur hein, pas la connection  :o !)

Y'a un problème dans ton code, c'est tout.
 
Éventuellement, cherche le code d'un serveur de n'importe quoi plutôt léger et regarde ce qui diffère au niveau de la fermeture du serveur.


---------------
« No question is too silly to ask, but, of course, some are too silly to answer. » -- Perl book
Reply

Marsh Posté le 05-05-2003 à 14:12:29    

Jar Jar a écrit :

Y'a un problème dans ton code, c'est tout.
 
Éventuellement, cherche le code d'un serveur de n'importe quoi plutôt léger et regarde ce qui diffère au niveau de la fermeture du serveur.


ohhhh
donc mon prof de reseau ET mon prof de systeme ont torts????
(d'apres eux c'est normal....) :sarcastic:

Reply

Marsh Posté le 05-05-2003 à 15:07:53    

harrysauce a écrit :


ohhhh
donc mon prof de reseau ET mon prof de systeme ont torts????
(d'apres eux c'est normal....) :sarcastic:  


La réponse c'est normal, non suivie d'explications du pourquoi, ca camoufle en general une ignorance.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 05-05-2003 à 15:23:25    

gilou a écrit :


La réponse c'est normal, non suivie d'explications du pourquoi, ca camoufle en general une ignorance.
A+,


le prof de reseau n'a pas dit pourquoi (a partir du moment ou il y a de la prog il n'a jamais su donner grande explication)
 
et le prof de systeme nous avait dit pourquoi mais je dois avouer que je m'en souviens plus du tout :D :D :D


Message édité par harrysauce le 05-05-2003 à 15:23:57
Reply

Marsh Posté le 05-05-2003 à 15:41:27    

harrysauce a écrit :


le prof de reseau n'a pas dit pourquoi (a partir du moment ou il y a de la prog il n'a jamais su donner grande explication)
 
et le prof de systeme nous avait dit pourquoi mais je dois avouer que je m'en souviens plus du tout :D :D :D


Une autre bonne façon de camoufler l'ignorance est de sortir une explication assez complexe pour être sur :
1) que l'autre n'y comprend rien.
2) qu'il ne s'en souviendra donc pas (et ne risquera donc pas de divulguer l'ignorance si bien camouflée).

Reply

Marsh Posté le 05-05-2003 à 15:42:05    

skeye a écrit :


Une autre bonne façon de camoufler l'ignorance est de sortir une explication assez complexe pour être sur :
1) que l'autre n'y comprend rien.
2) qu'il ne s'en souviendra donc pas (et ne risquera donc pas de divulguer l'ignorance si bien camouflée).


serial coder :love:

Reply

Marsh Posté le 05-05-2003 à 15:50:44    

skeye a écrit :


Une autre bonne façon de camoufler l'ignorance est de sortir une explication assez complexe pour être sur :
1) que l'autre n'y comprend rien.
2) qu'il ne s'en souviendra donc pas (et ne risquera donc pas de divulguer l'ignorance si bien camouflée).


:lol:
nan, c'etait comprehensible son truc qd meme, et puis c'est pas le genre du prof de systeme.....plus du prof de resau (sauf que lui y camoufle pas grand chose :o)

Reply

Marsh Posté le 05-05-2003 à 19:15:57    

harrysauce a écrit :

ohhhh
donc mon prof de reseau ET mon prof de systeme ont torts????
(d'apres eux c'est normal....) :sarcastic:

Oui, et je le te le prouve quand tu veux, par exemple avec un serveur apache.
 
C'est complètement évident que si tu ne déconnectes pas les clients, le port va rester occupé. Mais si tu les jartes, un mars et ça repart.


Message édité par Jar Jar le 05-05-2003 à 19:17:11

---------------
« No question is too silly to ask, but, of course, some are too silly to answer. » -- Perl book
Reply

Marsh Posté le 05-05-2003 à 19:20:06    

Salut, pour répondre, je ferme bien toutes les connexions qui étaient ouvertes : toutes les sockets crées par un accept sont fermées et puis enfin la socket d'écoute sur le port.
 
J'ai cherché de la doc justement pour voir si il fallait autre chose qu'un close(socket) pour fermer plus proprement le serveur, mais j'ai rien trouvé. Donc je reste sur mon impression de bizarre. C trop flou à mon goût.
 
De toute façon, je risque pas de poser la question a mes profs, ils viennent jamais et refusent de donner des réponses quand on leur envoie des mails.

Reply

Marsh Posté le 05-05-2003 à 21:03:55    

4.2 Why don't my sockets close?
 
When you issue the close() system call, you are closing your interface to the socket, not the socket itself. It is up to the kernel to close the socket. Sometimes, for really technical reasons, the socket is kept alive for a few minutes after you close it. It is normal, for example for the socket to go into a TIME_WAIT state, on the server side, for a few minutes. People have reported ranges from 20 seconds to 4 minutes to me. The official standard says that it should be 4 minutes. On my Linux system it is about 2 minutes. This is explained in great detail in 2.7 Please explain the TIME_WAIT state..
 
( source : http://www.manualy.sk/sock-faq/uni [...] html#ss4.2 )

Reply

Marsh Posté le 05-05-2003 à 22:14:04    

xWillow a écrit :

4.2 Why don't my sockets close?
 
When you issue the close() system call, you are closing your interface to the socket, not the socket itself. It is up to the kernel to close the socket. Sometimes, for really technical reasons, the socket is kept alive for a few minutes after you close it. It is normal, for example for the socket to go into a TIME_WAIT state, on the server side, for a few minutes. People have reported ranges from 20 seconds to 4 minutes to me. The official standard says that it should be 4 minutes. On my Linux system it is about 2 minutes. This is explained in great detail in 2.7 Please explain the TIME_WAIT state..
 
( source : http://www.manualy.sk/sock-faq/uni [...] html#ss4.2 )


:jap:
 
 
 
 
(et tu casses) [:sunny delight]

Reply

Marsh Posté le 05-05-2003 à 22:18:16    

xWillow a écrit :

4.2 Why don't my sockets close?
 
When you issue the close() system call, you are closing your interface to the socket, not the socket itself. It is up to the kernel to close the socket. Sometimes, for really technical reasons, the socket is kept alive for a few minutes after you close it. It is normal, for example for the socket to go into a TIME_WAIT state, on the server side, for a few minutes. People have reported ranges from 20 seconds to 4 minutes to me. The official standard says that it should be 4 minutes. On my Linux system it is about 2 minutes. This is explained in great detail in 2.7 Please explain the TIME_WAIT state..
 
( source : http://www.manualy.sk/sock-faq/uni [...] html#ss4.2 )


Ca au moins, ca a le merite d'etre clair. :jap:  
Sauf bien sur, le "for really technical reasons" qui pourrait etre détaillé :D
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 15-09-2008 à 10:17:14    

Salut,
 
Je sais que ce topic est vieux mais je me suis posé la meme question et j'ai fini par trouver la reponse sur ce site :
http://www.ibm.com/developerworks/ [...] index.html
 
En gros, il suffit de faire :
int sock, ret, on;
struct sockaddr_in servaddr;
 
/* Create a new stream (TCP) socket */
sock = socket( AF_INET, SOCK_STREAM, 0 ):
 
/* Enable address reuse */
on = 1;
ret = setsockopt( sock, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on) );
 
/* Allow connections to port 8080 from any available interface */
memset( &servaddr, 0, sizeof(servaddr) );
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl( INADDR_ANY );
servaddr.sin_port = htons( 45000 );
 
/* Bind to the address (interface/port) */
ret = bind( sock, (struct sockaddr *)&servaddr, sizeof(servaddr) );
 
a+

Reply

Marsh Posté le 15-09-2008 à 19:10:39    

merci, ton t'avais attendu.

Reply

Marsh Posté le 15-09-2008 à 19:15:15    

[:moule_bite]

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed