WSAAsyncGetServByPort, fonction (winsock.h)

La fonction WSAAsyncGetServByPort récupère de façon asynchrone les informations de service qui correspondent à un port et à un protocole.

Syntaxe

HANDLE WSAAsyncGetServByPort(
  [in]  HWND       hWnd,
  [in]  u_int      wMsg,
  [in]  int        port,
  [in]  const char *proto,
  [out] char       *buf,
  [in]  int        buflen
);

Paramètres

[in] hWnd

Handle de la fenêtre qui doit recevoir un message à la fin de la requête asynchrone.

[in] wMsg

Message à recevoir à la fin de la demande asynchrone.

[in] port

Port pour le service, dans l’ordre d’octet du réseau.

[in] proto

Pointeur vers un nom de protocole. Cela peut être NULL, auquel cas WSAAsyncGetServByPort recherche la première entrée de service pour laquelle s_port correspondent au port donné. Sinon, WSAAsyncGetServByPort correspond à la fois au port et au proto.

[out] buf

Pointeur vers la zone de données pour recevoir les données du serveur . La zone de données doit être supérieure à la taille d’une structure de service , car la zone de données est utilisée par windows Sockets pour contenir une structure de service et toutes les données référencées par les membres de la structure de service . Une mémoire tampon d’octets MAXGETHOSTSTRUCT est recommandée.

[in] buflen

Taille de la zone de données pour le paramètre buf , en octets.

Valeur retournée

La valeur de retour spécifie si l’opération asynchrone a été lancée avec succès. Cela n’implique pas la réussite ou l’échec de l’opération elle-même.

Si aucune erreur ne se produit, WSAAsyncGetServByPort retourne une valeur différente de zéro de type HANDLE qui est le handle de tâche asynchrone pour la requête (à ne pas confondre avec un HTASK Windows). Cette valeur peut être utilisée de deux façons. Il peut être utilisé pour annuler l’opération à l’aide de WSACancelAsyncRequest, ou il peut être utilisé pour faire correspondre des opérations asynchrones et des messages d’achèvement, en examinant le paramètre de message wParam .

Si l’opération asynchrone n’a pas pu être lancée, WSAAsyncGetServByPort retourne une valeur zéro et un numéro d’erreur spécifique peut être récupéré en appelant WSAGetLastError.

Les codes d’erreur suivants peuvent être définis lorsqu’une fenêtre d’application reçoit un message. Comme décrit ci-dessus, ils peuvent être extraits de l’élément lParam dans le message de réponse à l’aide de la macro WSAGETASYNCERROR .

Code d'erreur Signification
WSAENETDOWN
Le sous-système réseau a échoué.
WSAENOBUFS
L’espace de mémoire tampon est insuffisant.
WSAEFAULT
Le paramètre proto ou buf ne se trouve pas dans une partie valide de l’espace d’adressage du processus.
WSAHOST_NOT_FOUND
Port de réponse faisant autorité introuvable.
WSATRY_AGAIN
Port non authentifié introuvable ou défaillance du serveur.
WSANO_RECOVERY
Erreurs non récupérables, la base de données des services n’est pas accessible.
WSANO_DATA
Nom valide, aucun enregistrement de données de type demandé.
 

Les erreurs suivantes peuvent se produire au moment de l’appel de fonction et indiquent que l’opération asynchrone n’a pas pu être lancée.

Code d'erreur Signification
WSANOTINITIALISED Un appel WSAStartup réussi doit se produire avant d’utiliser cette fonction.
WSAENETDOWN Le sous-système réseau a échoué.
WSAEINPROGRESS Un appel Windows Sockets 1.1 bloquant est en cours ou le fournisseur de services traite toujours une fonction de rappel.
WSAEWOULDBLOCK L’opération asynchrone ne peut pas être planifiée pour l’instant en raison de contraintes de ressources ou d’autres contraintes au sein de l’implémentation de Windows Sockets.

Remarques

La fonction WSAAsyncGetServByPort est une version asynchrone de getservbyport et est utilisée pour récupérer les informations de service correspondant à un numéro de port. Windows Sockets lance l’opération et retourne immédiatement à l’appelant, en transmettant un handle de tâche opaque et asynchrone que l’application peut utiliser pour identifier l’opération. Une fois l’opération terminée, les résultats (le cas échéant) sont copiés dans la mémoire tampon fournie par l’appelant et un message est envoyé à la fenêtre de l’application.

Une fois l’opération asynchrone terminée, la fenêtre d’application indiquée par le paramètre hWnd reçoit un message dans le paramètre wMsg . Le paramètre wParam contient le handle de tâche asynchrone tel que retourné par l’appel de fonction d’origine. Les 16 bits élevés de lParam contiennent un code d’erreur. Le code d’erreur peut être n’importe quelle erreur, comme défini dans Winsock2.h. Un code d’erreur égal à zéro indique la réussite de l’opération asynchrone.

En cas de réussite, la mémoire tampon spécifiée pour l’appel de fonction d’origine contient une structure de service . Pour accéder aux membres de cette structure, l’adresse de la mémoire tampon d’origine doit être convertie en pointeur de structure de service et accessible comme il convient.

Si le code d’erreur est WSAENOBUFS, la taille de la mémoire tampon spécifiée par buflen dans l’appel d’origine était trop petite pour contenir toutes les informations obtenues. Dans ce cas, les 16 bits faibles de lParam contiennent la taille de la mémoire tampon requise pour fournir toutes les informations nécessaires. Si l’application décide que les données partielles sont insuffisantes, elle peut réémettre l’appel de fonction WSAAAsyncGetServByPort avec une mémoire tampon suffisamment grande pour recevoir toutes les informations souhaitées (c’est-à-dire, pas moins de 16 bits de lParam).

La mémoire tampon spécifiée pour cette fonction est utilisée par les sockets Windows pour construire une structure de service avec le contenu des zones de données référencées par les membres de la même structure de service . Pour éviter l’erreur WSAENOBUFS , l’application doit fournir une mémoire tampon d’au moins MAXGETHOSTSTRUCT octets (comme défini dans Winsock2.h).

Le code d’erreur et la longueur de la mémoire tampon doivent être extraits de l’objet lParam à l’aide des macros WSAGETASYNCERROR et WSAGETASYNCBUFLEN, définies dans Winsock2.h comme suit :

#include <windows.h>

#define WSAGETASYNCBUFLEN(lParam)           LOWORD(lParam)
#define WSAGETASYNCERROR(lParam)            HIWORD(lParam)

L’utilisation de ces macros optimise la portabilité du code source pour l’application.

Configuration requise

   
Client minimal pris en charge Windows 2000 Professionnel [applications de bureau uniquement]
Serveur minimal pris en charge Windows 2000 Server [applications de bureau uniquement]
Plateforme cible Windows
En-tête winsock.h (inclure Winsock2.h)
Bibliothèque Ws2_32.lib
DLL Ws2_32.dll

Voir aussi

WSACancelAsyncRequest

Winsock Functions

Référence Winsock

getservbyport