receive - socket tcp c#




Annulation d'un appel Socket.xxxxAsync (2)

Après avoir appelé Socket.Shutdown, Socket.Close et Socket.Disconnect, il semble que Socket.ReceiveAsync n'abandonne pas. Les tentatives de réutilisation de l'objet SocketAsycEventArgs utilisé dans l'appel ReceiveAsync (suggéré dans la documentation comme étant la meilleure pratique) entraînent l'erreur suivante:

Une opération de socket asynchrone est déjà en cours en utilisant cette instance SocketAsyncEventArgs

Que dois-je faire pour obtenir ReceiveAsync pour libérer son emprise sur cette instance de SocketAsyncEventArgs?

Edit: J'ai travaillé autour de ceci en marquant une réception en attente et ne faisant aucun nettoyage jusqu'à ce que la réception arrive (c.-à-d. Completed est distribué). Ne me sens pas trop bien. Ne peut-il pas être abandonné, comme l'API WebRequest?


Il ne semble pas y avoir moyen d'annuler la réception asynchrone.

Lorsque le socket est fermé, cela force la réception à se terminer, et la propriété SocketError du paramètre SocketAsyncEventArgs à votre méthode de rappel aura une valeur de SocketError.OperationAborted . Lorsque cette condition est rencontrée, vous pouvez renvoyer l'objet SocketAsyncEventArgs au pool réutilisable.

Ceci est démontré dans l'exemple montré ici . Plus précisément, regardez la méthode ProcessReceive (), qui appelle la méthode CloseClientSocket () lorsque e.BytesTransferred == 0 ou e.SocketError != SocketError.Success . La méthode CloseClientSocket () est où l'objet SocketAsyncEventArgs est renvoyé au pool.


La cause la plus probable est lors de la réutilisation de SocketAsyncEventArgs que vous appelez:

SAE.Completed + = new EventHandler (SocketEventArg_Completed);

Cela entraînera votre callback à être appelé plusieurs fois !!!

Veillez à définir uniquement le gestionnaire Terminé une fois.





sockets