10038 erreur de socket
Est-il une solution pour 10038 erreur de serveur .j'ai fait de codage en c++;
le serveur fonctionne très bien, de 10 à 12 heures, mais sudenly il donne 10038 erreur de socket
OriginalL'auteur SunilRai86 | 2010-10-16
Vous devez vous connecter pour publier un commentaire.
Sans voir votre code: le symptôme que vous décrivez ressemble vous êtes une fuite de mémoire/de ressources, c'est à dire oublier gratuit/supprimer des objets que vous allouez. Il pourrait aussi être un problème de synchronisation. Je vous suggère de poster votre (coupe-bas) du code.
Pouvez-vous expliquer le cryptique: "Une opération a été tentée sur autre chose qu'un socket"
Au jugé, le "quelque chose qui n'est pas un socket" utilisé pour être un socket, qui est maintenant fermé/désalloué.
OriginalL'auteur Mitch Wheat
Je parie que vous êtes l'accès à une prise que vous avez déjà fermé. C'est un très commun de timing bug dans WinSock programmation - la bonne nouvelle et une mauvaise nouvelle, car il est difficile de reproduire), c'est que vous n'êtes pas frapper très souvent, donc il est probable que votre code n'a pas besoin de beaucoup de travail pour le rendre parfait. Je pense que vous devriez ajouter thread-safe diagnostics de sortie d'une chaîne, y compris la prise de valeur (une
int
, essentiellement) sur chaque ouverture et de fermeture, et à partir de n'importe où vous voyez ce 10038 ou d'autres erreurs inattendues.Si vous pouvez ajouter ces diagnostics et ensuite mettre en place un test de stress qui se concentre sur ouvrir et de fermer des zones dans votre programme (vous pouvez avoir besoin de démonter le code à un petit sous-ensemble de test unitaire des prises de manipulation, peut-être faire ce dos-à-dos sur localhost, ou à deux connecté au réseau local de machines), alors il sera probablement se manifeste beaucoup plus rapidement que de 10 à 12 heures et vous pouvez trouver et résoudre d'autres périodes, le long de la manière. L'objectif est d'essayer de compresser de 10 à 12 heures de "normal" socket activité dans un aussi petit espace de temps que possible, pour bien exposer le plus difficile à détecter les problèmes de simultanéité.
OriginalL'auteur Steve Townsend
Il peut y avoir deux raisons à cela:
closesocket
), et toujours essayer de l'utiliser.Une telle erreur est toujours un bug, il n'est pas lié au réel l'activité du réseau/de l'état et etc. C'est l'équivalent (en un certain sens), soit de tenter d'utiliser une ressource/mémoire après vous gratuit, ou tout simplement une référence à un pointeur non initialisé.
De sorte que, pour résoudre le 10038 vous devez corriger votre code.
P. S. Si vous avez une application multi-thread - il est probable que vous fermez la prise dans un thread, alors que l'autre thread encore à essayer de l'utiliser.
De toute façon, il y a une bonne pratique pour initialiser socket descripteurs de
INVALID_SOCKET
au début. Aussi le mettre àINVALID_SOCKET
immédiatement lorsque vous le fermez.Puis, avant d'essayer de l'utiliser, vous pouvez vérifier si la prise est valide. De cette manière, vous pouvez trouver le scénario qui pose problème.
OriginalL'auteur valdo
Également regarder dehors pour le fait que, tout au moins dans Windows -- vous obtiendrez 10038 si vous essayez d'envoyer sur un socket sur un fil a été ouvert dans un thread différent.
non, à ma connaissance, vous ne pouvez pas partager les sockets entre les threads (au moins dans Windoze).
OriginalL'auteur Ted W