socket serveur toujours présente quand on relance le prog [Linux C] - C++ - Programmation
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....)
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 !
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 )
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....
Marsh Posté le 05-05-2003 à 11:38:47
Bizarre ce truc, tu fermes correctement ta socket au moins ?
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......
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...
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 !)
Marsh Posté le 05-05-2003 à 13:31:22
ReplyMarsh 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 !) |
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.
Marsh Posté le 05-05-2003 à 14:12:29
Jar Jar a écrit : Y'a un problème dans ton code, c'est tout. |
ohhhh
donc mon prof de reseau ET mon prof de systeme ont torts????
(d'apres eux c'est normal....)
Marsh Posté le 05-05-2003 à 15:07:53
harrysauce a écrit : |
La réponse c'est normal, non suivie d'explications du pourquoi, ca camoufle en general une ignorance.
A+,
Marsh Posté le 05-05-2003 à 15:23:25
gilou 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
Marsh Posté le 05-05-2003 à 15:41:27
harrysauce 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).
Marsh Posté le 05-05-2003 à 15:42:05
skeye a écrit : |
serial coder
Marsh Posté le 05-05-2003 à 15:50:44
skeye a écrit : |
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 )
Marsh Posté le 05-05-2003 à 19:15:57
harrysauce a écrit : ohhhh |
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.
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.
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 )
Marsh Posté le 05-05-2003 à 22:14:04
xWillow a écrit : 4.2 Why don't my sockets close? |
(et tu casses)
Marsh Posté le 05-05-2003 à 22:18:16
xWillow a écrit : 4.2 Why don't my sockets close? |
Ca au moins, ca a le merite d'etre clair.
Sauf bien sur, le "for really technical reasons" qui pourrait etre détaillé
A+,
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+
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.