GetQueuedCompletionStatus renvoie l'erreur_netname_deleted sur la fermeture de la prise distante
-
14-11-2019 - |
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
La solution
Voici les scénarios que vous devez surveiller lorsque vous appelez GetQueuedCompletionStatus
:
GetQueuedCompletionStatus
RetourTRUE
: Un paquet d'achèvement réussi a été reçu, tous les paramètres de sortie ont été remplis.GetQueuedCompletionStatus
RetourFALSE
,lpOverlapped == NULL
: Aucun paquet n'a été désactivé. Les autres paramètres OUT contiennent des valeurs indéterminées.GetQueuedCompletionStatus
RetourFALSE
,lpOverlapped != NULL
: La fonction a désactivé un paquet d'achèvement échoué. Le code d'erreur est disponible viaGetLastError
.
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.