2015-03-08 1 views
2

Dans la documentation WSARecv(), il dit:Que signifie l'information de contexte lorsque l'on parle d'E/S superposées?

Si lpCompletionRoutine est NULL, le paramètre est ignoré hEvent et peut être utilisé par l'application pour transmettre des informations de contexte à la routine d'achèvement .

Que signifie "information de contexte"? Je pense que cela signifie que j'associe généralement une structure de données avec chaque socket, qui peut contenir des membres tels que le handle de socket et le tampon de réception. Et donc quand j'appelle WSARecv() je lui passerai un pointeur vers une instance de cette structure de données, et quand je serai averti qu'une opération de réception est terminée, j'obtiendrai le pointeur que j'ai passé plus tôt, et ainsi je saurai quelle socket a initié l'opération de réception, et qu'est ce que le tampon de réception, etc.

Est-ce que ma compréhension est correcte?

+4

C'est fondamentalement correct. Le contexte est une information définie par l'application (généralement un pointeur vers une structure personnalisée) qui peut être utilisée par le rappel pour effectuer son opération. Vous trouverez ce schéma dans l'API Windows, par ex. le paramètre 'lpParam' dans un appel à [CreateWindow] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms632679.aspx). Cela peut également être utilisé par une application pour transférer des informations supplémentaires à un destinataire. – IInspectable

Répondre

1

Que signifie "information de contexte"?

Données définies par l'utilisateur. Lorsque le protocole IOCP ignore ce champ, vous pouvez l'utiliser pour transmettre les données personnalisées (contextuelles) que vous souhaitez à la routine d'achèvement.

+0

Mais ce n'est pas sécurisé. Une meilleure option consiste à ajouter des champs après la structure 'OVERLAPPED', puisque vous récupérez le même' OVERLAPPED * 'que vous passez. –

+2

Et vous ne pensez pas que ce soit moins sécurisé? Une opération IOCP prend seulement un 'OVERLAPPED *' en entrée, et vous renvoie un 'OVERLAPPED *' en sortie. Vous devez toujours lancer la conversion de type pour accéder aux champs supplémentaires que vous ajoutez. Que vous passiez un pointeur via 'hEvent', ou que vous passiez un pointeur via OVERLAPED *', c'est la même chose dans un sens ou dans l'autre - le pointeur est passé comme-à la routine d'achèvement, et vous l'utilisez si nécessaire. L'extension 'OVERLAPPED' est l'approche commune, mais ce n'est pas la seule approche. –

+1

Ou utilisez la touche 'OVERLAPPED *' comme clé (par exemple, 'std :: map') –