SO_LINGER et les sockets fermants (WINSOCK)

Je suis en train d’écrire une application winsock multithread et d’avoir quelques problèmes avec la fermeture des sockets. Tout d’abord, existe-t-il une limite pour un nombre de sockets ouverts simultanément? disons comme 32 sockets toutes en une fois.

J’établis une connexion sur l’une des sockets et passe des informations, et tout se passe bien. Le problème est que lorsque je déconnecte le socket, puis que je me reconnecte à la même destination, je reçois un RST du serveur après mon SYN Je n’ai pas le code pour l’application serveur, donc je ne peux pas le déboguer.

Quand j’ai utilisé SO_LINGER et qu’il a envoyé un drapeau RST à la fin de chaque session, cela a fonctionné. mais je ne veux pas mettre fin à mes relations de cette façon. lorsque SO_LINGER n’était pas utilisé, un drapeau FIN était envoyé, mais il semblait que la connexion n’était pas vraiment fermée.

de l’aide? Merci

Sous Unix, il existe une limite de descripteur de fichier par processus – je suppose que sous Windows, il s’agit de “handles”.

Vous êtes probablement en bind() votre socket client à un port fixe. C’est peut-être pour cette raison que le serveur refuse votre connexion ultérieure. Essayez les ports éphémères normaux.

Premièrement, je suis d’accord avec Nikolai, êtes-vous en train de lier votre socket client?

Si tel est le cas, le socket côté serveur est toujours dans TIME_WAIT et annule la nouvelle tentative de connexion. En liant le socket client, vous obligez le serveur à réutiliser exactement la même connexion que celle actuellement en attente de la période d’attente 2MSL. Elle ne peut pas être réutilisée à ce stade et vous voyez ce que vous voyez. . Il n’est généralement pas nécessaire de lier le port client, arrêtez de le faire et votre problème disparaîtra probablement.

Deuxièmement, oui, le nombre de sockets ouverts sur les plates-formes Windows est limité, mais ils sont liés aux ressources plutôt qu’à un nombre codé en dur.

Chaque socket ouvert utilise de la mémoire de «pool non paginé» et chaque demande de lecture ou d’écriture en attente sur un socket est également susceptible d’utiliser le «pool non paginé» et d’avoir des pages de mémoire verrouillées en mémoire pendant les E / S (il existe une limite à la nombre de pages pouvant être verrouillées). Cela dit, sur Vista et les versions ultérieures, il y a beaucoup plus de «pools non paginés» disponibles que sur les versions précédentes de Windows et même dans ce cas, j’ai réussi à obtenir plus de 70 000 connexions actives simultanées sur une boîte XP à spécifications assez basses (voir ici: http: / /www.lenholgate.com/blog/2005/11/windows-tcpip-server-performance.html ). Notez qu’il existe des limites distinctes sur le nombre de connexions sortantes que vous pouvez établir (ce qui est plus susceptible de vous intéresser), mais elle est d’environ 4000 par défaut et peut être ajustée en définissant MAX_USER_PORT voir ici: Nombre maximal de protocoles TCP simultanés. / Connexions IP – Win XP SP3 pour plus de détails.