GetQueuedCompletionStatus renvoie l'erreur_netname_deleted sur la fermeture de la prise distante

StackOverflow https://stackoverflow.com/questions/5475171

Question

J'écris un petit serveur-client-stuff à l'aide d'un port d'accès aux I / O.

Je fais connecter le serveur et le client via ACCEPTEX sur mon port de complétion. Une fois que le client a connecté, le socket client est associé au port d'achèvement et qu'un appel chevauché à WSARECV sur cette prise est invoqué.

Tout fonctionne très bien, jusqu'à ce que je ferme le programme de test client.GetQueuedCompletionStatus() Retour FALSE et GetLastError Retour

Error_netname_deleted

, ce qui a du sens pour moi (après avoir lu la description sur le MSDN).

Mais mon problème est que j'ai pensé à l'appel à GetQueuedCompletionStatus me rendrait un paquet indiquant la défaillance due à la fermeture de la prise, car WSARecv renvoyerait la valeur de retour adaptée. Comme ce n'est pas le cas, je ne sais pas quelle prise de clients a provoqué l'erreur et je ne peux pas agir comme j'ai besoin (libérer des structures, nettoyage pour cette connexion particulière, etc.) ...

Une suggestion sur la façon de résoudre ce problème, ou des indices?

Merci:)

ÉDITER: http://codepad.org/weyinaso <- le code responsable ... "l'erreur" se produit aux premières fonctions début de la boucle while (l'appel à GetCompletionStatus() Ce qui n'est qu'un wrapper pour getqueuedCompletionStatus () qui fonctionne bien dans d'autres cas) [l'a publié là-bas, car il a l'air merdique et désordonné ici

Était-ce utile?

La solution

Voici les scénarios que vous devez surveiller lorsque vous appelez GetQueuedCompletionStatus:

  • GetQueuedCompletionStatus Retour TRUE: Un paquet d'achèvement réussi a été reçu, tous les paramètres de sortie ont été remplis.
  • GetQueuedCompletionStatus Retour FALSE, lpOverlapped == NULL: Aucun paquet n'a été désactivé. Les autres paramètres OUT contiennent des valeurs indéterminées.
  • GetQueuedCompletionStatus Retour FALSE, lpOverlapped != NULL: La fonction a désactivé un paquet d'achèvement échoué. Le code d'erreur est disponible via GetLastError.

Pour répondre à votre question, quand GetQueuedCompletionStatus Retour FALSE et lpOverlapped != NULL, il y a eu une fin d'achèvement d'E / S échoué. C'est la valeur de lpOverlapped dont vous devez vous préoccuper.

Autres conseils

Je sais que c'est une vieille question, mais j'ai trouvé cette page tout en googlant sans google sur des détails sur ERROR_NETNAME_DELETED. C'est une erreur que j'obtiens en faisant un chevauchement Readfile().

Après un débogage, il s'est avéré que le problème a été causé par un programme qui écrivait à une prise mais oubliant d'appeler closesocket() avant d'utiliser ExitProcess() (En raison de problèmes de collecte des ordures). Appel CloseHandle() n'a pas empêché l'erreur, et n'a pas ajouté WSACleanup() avant de ExitProcess(). Cependant, l'ajout d'un bref sommeil avant la sortie du client a empêché l'erreur. Peut-être éviter ExitProcess() aurait également empêché le problème.

Je soupçonne donc que votre problème est causé par la sortie du programme sans fermer correctement la prise.

Je ne pense pas que ce serait un problème sur UNIX où les prises ne sont que des descripteurs de fichiers ordinaires.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top