Je suis actuellement en train de coder une appli client qui interagit
avec le port 80 d'un serveur (un client http).
Seulement, j'ai remarqué qu'après la création de plusieurs socket (plus
de 3900) assez rapidement, j'obtient systématiquement l'erreur 10048
(address in use). D'après ce que j'ai pu constater, c'est le port local
qui n'est pas libéré lorsque je fais un closesocket().
Ma question est donc : Comment fait on pour libérer le port? Comment
dire au système qu'on ne l'utilise plus.
Voici un bout de code (codé en vitesse) qui met en évidence l'erreur. Il
se connect et se déconnect immédiatement du port 80 d'un serveur (en
l'occurence 127.0.0.1)
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Michael DOUBEZ
Bonjour tous le monde,
Je suis actuellement en train de coder une appli client qui interagit avec le port 80 d'un serveur (un client http).
Seulement, j'ai remarqué qu'après la création de plusieurs socket (plus de 3900) assez rapidement, j'obtient systématiquement l'erreur 10048 (address in use). D'après ce que j'ai pu constater, c'est le port local qui n'est pas libéré lorsque je fais un closesocket().
C'est dû au protocole TCP et au système de terminaison 3 hand shake. Le système continue d'écouter sur le port local pour envoyer un RESET si un paquet arrive.
Je ne connait pas windows mais je ne pense pas que ce soit la raison de l'erreur (il y a plus de 3900 ports locaux libres). Ca ressemble à une limitation à 4092 qq chose.
Ma question est donc : Comment fait on pour libérer le port? Comment dire au système qu'on ne l'utilise plus.
Voici un bout de code (codé en vitesse) qui met en évidence l'erreur. Il se connect et se déconnect immédiatement du port 80 d'un serveur (en l'occurence 127.0.0.1)[snip]
Peut être un groupe windows t'aideras plus. Ou en cherchant un code de crawler sur le net.
Michael
Bonjour tous le monde,
Je suis actuellement en train de coder une appli client qui interagit
avec le port 80 d'un serveur (un client http).
Seulement, j'ai remarqué qu'après la création de plusieurs socket (plus
de 3900) assez rapidement, j'obtient systématiquement l'erreur 10048
(address in use). D'après ce que j'ai pu constater, c'est le port local
qui n'est pas libéré lorsque je fais un closesocket().
C'est dû au protocole TCP et au système de terminaison 3 hand shake. Le
système continue d'écouter sur le port local pour envoyer un RESET si un
paquet arrive.
Je ne connait pas windows mais je ne pense pas que ce soit la raison de
l'erreur (il y a plus de 3900 ports locaux libres). Ca ressemble à une
limitation à 4092 qq chose.
Ma question est donc : Comment fait on pour libérer le port? Comment
dire au système qu'on ne l'utilise plus.
Voici un bout de code (codé en vitesse) qui met en évidence l'erreur. Il
se connect et se déconnect immédiatement du port 80 d'un serveur (en
l'occurence 127.0.0.1)[snip]
Peut être un groupe windows t'aideras plus. Ou en cherchant un code de
crawler sur le net.
Je suis actuellement en train de coder une appli client qui interagit avec le port 80 d'un serveur (un client http).
Seulement, j'ai remarqué qu'après la création de plusieurs socket (plus de 3900) assez rapidement, j'obtient systématiquement l'erreur 10048 (address in use). D'après ce que j'ai pu constater, c'est le port local qui n'est pas libéré lorsque je fais un closesocket().
C'est dû au protocole TCP et au système de terminaison 3 hand shake. Le système continue d'écouter sur le port local pour envoyer un RESET si un paquet arrive.
Je ne connait pas windows mais je ne pense pas que ce soit la raison de l'erreur (il y a plus de 3900 ports locaux libres). Ca ressemble à une limitation à 4092 qq chose.
Ma question est donc : Comment fait on pour libérer le port? Comment dire au système qu'on ne l'utilise plus.
Voici un bout de code (codé en vitesse) qui met en évidence l'erreur. Il se connect et se déconnect immédiatement du port 80 d'un serveur (en l'occurence 127.0.0.1)[snip]
Peut être un groupe windows t'aideras plus. Ou en cherchant un code de crawler sur le net.
Michael
Laurent Pointal
Bonjour tous le monde,
Je suis actuellement en train de coder une appli client qui interagit avec le port 80 d'un serveur (un client http).
Seulement, j'ai remarqué qu'après la création de plusieurs socket (plus de 3900) assez rapidement, j'obtient systématiquement l'erreur 10048 (address in use). D'après ce que j'ai pu constater, c'est le port local qui n'est pas libéré lorsque je fais un closesocket().
Pas sécure... mais peut aider à réutiliser les ports.
Ma question est donc : Comment fait on pour libérer le port? Comment dire au système qu'on ne l'utilise plus.
Voici un bout de code (codé en vitesse) qui met en évidence l'erreur. Il se connect et se déconnect immédiatement du port 80 d'un serveur (en l'occurence 127.0.0.1)
Merci à tous ;-) Julien
A+
Laurent.
Bonjour tous le monde,
Je suis actuellement en train de coder une appli client qui interagit
avec le port 80 d'un serveur (un client http).
Seulement, j'ai remarqué qu'après la création de plusieurs socket (plus
de 3900) assez rapidement, j'obtient systématiquement l'erreur 10048
(address in use). D'après ce que j'ai pu constater, c'est le port local
qui n'est pas libéré lorsque je fais un closesocket().
Pas sécure... mais peut aider à réutiliser les ports.
Ma question est donc : Comment fait on pour libérer le port? Comment
dire au système qu'on ne l'utilise plus.
Voici un bout de code (codé en vitesse) qui met en évidence l'erreur. Il
se connect et se déconnect immédiatement du port 80 d'un serveur (en
l'occurence 127.0.0.1)
Je suis actuellement en train de coder une appli client qui interagit avec le port 80 d'un serveur (un client http).
Seulement, j'ai remarqué qu'après la création de plusieurs socket (plus de 3900) assez rapidement, j'obtient systématiquement l'erreur 10048 (address in use). D'après ce que j'ai pu constater, c'est le port local qui n'est pas libéré lorsque je fais un closesocket().
Pas sécure... mais peut aider à réutiliser les ports.
Ma question est donc : Comment fait on pour libérer le port? Comment dire au système qu'on ne l'utilise plus.
Voici un bout de code (codé en vitesse) qui met en évidence l'erreur. Il se connect et se déconnect immédiatement du port 80 d'un serveur (en l'occurence 127.0.0.1)
Merci à tous ;-) Julien
A+
Laurent.
James Kanze
On Aug 9, 12:07 pm, Michael DOUBEZ wrote:
Je suis actuellement en train de coder une appli client qui interagit avec le port 80 d'un serveur (un client http).
Seulement, j'ai remarqué qu'après la création de plusieurs socket (plus de 3900) assez rapidement, j'obtient systématiquement l'erreur 10048 (address in use). D'après ce que j'ai pu constater, c'est le port loc al qui n'est pas libéré lorsque je fais un closesocket().
C'est dû au protocole TCP et au système de terminaison 3 hand shake. Le système continue d'écouter sur le port local pour envoyer un RESET si un paquet arrive.
La question n'a réelement rien à voir avec le C++, mais il est possible (probable ?) aussi que le système ne réutilise pas le numéro de port tout de suite. Même si on l'a fermé de son côté, c'est possible qu'il y a des trames qui lui sont destinées et qui trainent quelque part dans la toile. Ça ne m'étonnerait donc pas que le numéro de port reste reservé quelque sécondes après la fermature complète (c-à-d la fin du hand shack).
-- James Kanze (GABI Software) email: Conseils en informatique orientée objet/ Beratung in objektorientierter Datenverarbeitung 9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
On Aug 9, 12:07 pm, Michael DOUBEZ <michael.dou...@free.fr> wrote:
Je suis actuellement en train de coder une appli client qui interagit
avec le port 80 d'un serveur (un client http).
Seulement, j'ai remarqué qu'après la création de plusieurs socket (plus
de 3900) assez rapidement, j'obtient systématiquement l'erreur 10048
(address in use). D'après ce que j'ai pu constater, c'est le port loc al
qui n'est pas libéré lorsque je fais un closesocket().
C'est dû au protocole TCP et au système de terminaison 3 hand shake. Le
système continue d'écouter sur le port local pour envoyer un RESET si un
paquet arrive.
La question n'a réelement rien à voir avec le C++, mais il est
possible (probable ?) aussi que le système ne réutilise pas le
numéro de port tout de suite. Même si on l'a fermé de son côté,
c'est possible qu'il y a des trames qui lui sont destinées et
qui trainent quelque part dans la toile. Ça ne m'étonnerait donc
pas que le numéro de port reste reservé quelque sécondes après
la fermature complète (c-à-d la fin du hand shack).
--
James Kanze (GABI Software) email:james.kanze@gmail.com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
Je suis actuellement en train de coder une appli client qui interagit avec le port 80 d'un serveur (un client http).
Seulement, j'ai remarqué qu'après la création de plusieurs socket (plus de 3900) assez rapidement, j'obtient systématiquement l'erreur 10048 (address in use). D'après ce que j'ai pu constater, c'est le port loc al qui n'est pas libéré lorsque je fais un closesocket().
C'est dû au protocole TCP et au système de terminaison 3 hand shake. Le système continue d'écouter sur le port local pour envoyer un RESET si un paquet arrive.
La question n'a réelement rien à voir avec le C++, mais il est possible (probable ?) aussi que le système ne réutilise pas le numéro de port tout de suite. Même si on l'a fermé de son côté, c'est possible qu'il y a des trames qui lui sont destinées et qui trainent quelque part dans la toile. Ça ne m'étonnerait donc pas que le numéro de port reste reservé quelque sécondes après la fermature complète (c-à-d la fin du hand shack).
-- James Kanze (GABI Software) email: Conseils en informatique orientée objet/ Beratung in objektorientierter Datenverarbeitung 9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
espie
In article , James Kanze wrote:
La question n'a réelement rien à voir avec le C++, mais il est possible (probable ?) aussi que le système ne réutilise pas le numéro de port tout de suite. Même si on l'a fermé de son côté, c'est possible qu'il y a des trames qui lui sont destinées et qui trainent quelque part dans la toile. Ça ne m'étonnerait donc pas que le numéro de port reste reservé quelque sécondes après la fermature complète (c-à-d la fin du hand shack).
30 secondes a 2 minutes selon les systemes. Ca fait partie du protocole. Ca permet d'eviter de s'emmeler les pinceaux entre deux connexions. Le temps en question a ete calcule a la louche par rapport au TTL des paquets. La connexion est en fait asymetrique: seul le bout qui ferme la connexion est oblige d'avoir ce delai supplementaire. C'est une des conneries du protocole HTTP, et c'est pour ca que, dans les protocoles bien concus, c'est le *client* qui ferme la connexion. (une fin normale de connexion, c'est un FIN / FIN,Ack / Ack. Le Ack final peut se perdre, auquel cas l'autre bout renverra un FIN,Ack apres la fin du timeout, et il n'y a pas de facon de savoir que le paquet s'est perdu sans constater une reemission.
Note qu'on peut ruser, ce que font des systemes intelligents: la restriction sur la reutilisation d'un port peut etre leve si la connexion provient d'une autre adresse IP, et si on sait retrouver ou arrive chaque paquet.
Les fonctionnalites a la SO_REUSEADDR sont *exclusivement* concues pour des situations de tests (style, montee en charge rapide sur un reseau local...)
In article <1186732493.499686.325190@m37g2000prh.googlegroups.com>,
James Kanze <james.kanze@gmail.com> wrote:
La question n'a réelement rien à voir avec le C++, mais il est
possible (probable ?) aussi que le système ne réutilise pas le
numéro de port tout de suite. Même si on l'a fermé de son côté,
c'est possible qu'il y a des trames qui lui sont destinées et
qui trainent quelque part dans la toile. Ça ne m'étonnerait donc
pas que le numéro de port reste reservé quelque sécondes après
la fermature complète (c-à-d la fin du hand shack).
30 secondes a 2 minutes selon les systemes. Ca fait partie du protocole.
Ca permet d'eviter de s'emmeler les pinceaux entre deux connexions.
Le temps en question a ete calcule a la louche par rapport au TTL des
paquets. La connexion est en fait asymetrique: seul le bout qui ferme
la connexion est oblige d'avoir ce delai supplementaire. C'est une des
conneries du protocole HTTP, et c'est pour ca que, dans les protocoles
bien concus, c'est le *client* qui ferme la connexion. (une fin normale
de connexion, c'est un FIN / FIN,Ack / Ack. Le Ack final peut se perdre,
auquel cas l'autre bout renverra un FIN,Ack apres la fin du timeout,
et il n'y a pas de facon de savoir que le paquet s'est perdu sans constater
une reemission.
Note qu'on peut ruser, ce que font des systemes intelligents: la
restriction sur la reutilisation d'un port peut etre leve si la connexion
provient d'une autre adresse IP, et si on sait retrouver ou arrive chaque
paquet.
Les fonctionnalites a la SO_REUSEADDR sont *exclusivement* concues pour
des situations de tests (style, montee en charge rapide sur un reseau
local...)
La question n'a réelement rien à voir avec le C++, mais il est possible (probable ?) aussi que le système ne réutilise pas le numéro de port tout de suite. Même si on l'a fermé de son côté, c'est possible qu'il y a des trames qui lui sont destinées et qui trainent quelque part dans la toile. Ça ne m'étonnerait donc pas que le numéro de port reste reservé quelque sécondes après la fermature complète (c-à-d la fin du hand shack).
30 secondes a 2 minutes selon les systemes. Ca fait partie du protocole. Ca permet d'eviter de s'emmeler les pinceaux entre deux connexions. Le temps en question a ete calcule a la louche par rapport au TTL des paquets. La connexion est en fait asymetrique: seul le bout qui ferme la connexion est oblige d'avoir ce delai supplementaire. C'est une des conneries du protocole HTTP, et c'est pour ca que, dans les protocoles bien concus, c'est le *client* qui ferme la connexion. (une fin normale de connexion, c'est un FIN / FIN,Ack / Ack. Le Ack final peut se perdre, auquel cas l'autre bout renverra un FIN,Ack apres la fin du timeout, et il n'y a pas de facon de savoir que le paquet s'est perdu sans constater une reemission.
Note qu'on peut ruser, ce que font des systemes intelligents: la restriction sur la reutilisation d'un port peut etre leve si la connexion provient d'une autre adresse IP, et si on sait retrouver ou arrive chaque paquet.
Les fonctionnalites a la SO_REUSEADDR sont *exclusivement* concues pour des situations de tests (style, montee en charge rapide sur un reseau local...)