Funzione WSAAsyncGetProtoByNumber (winsock2.h)
La funzione WSAAsyncGetProtoByNumber recupera in modo asincrono le informazioni sul protocollo che corrispondono a un numero di protocollo.
Sintassi
HANDLE WSAAPI WSAAsyncGetProtoByNumber(
[in] HWND hWnd,
[in] u_int wMsg,
[in] int number,
[out] char *buf,
[in] int buflen
);
Parametri
[in] hWnd
Handle della finestra che riceverà un messaggio al termine della richiesta asincrona.
[in] wMsg
Messaggio da ricevere al termine della richiesta asincrona.
[in] number
Numero di protocollo da risolvere, in ordine di byte host.
[out] buf
Puntatore all'area dati per ricevere i dati protoent . L'area dati deve essere maggiore della dimensione di una struttura protoent perché l'area dati viene usata da Windows Sockets per contenere una struttura protoent e tutti i dati a cui fa riferimento i membri della struttura protoent . È consigliabile un buffer di byte MAXGETHOSTSTRUCT.
[in] buflen
Dimensioni dell'area dati per il parametro buf , in byte.
Valore restituito
Il valore restituito specifica se l'operazione asincrona è stata avviata correttamente. Non implica esito positivo o negativo dell'operazione stessa.
Se non si verifica alcun errore, WSAAsyncGetProtoByNumber restituisce un valore diverso da zero di tipo HANDLE che rappresenta l'handle attività asincrono per la richiesta (non da confondere con un HTASK di Windows). Questo valore può essere usato in due modi. Può essere usato per annullare l'operazione usando WSACancelAsyncRequest oppure può essere usato per associare operazioni asincrone e messaggi di completamento, esaminando il parametro del messaggio wParam .
Se l'operazione asincrona non è stata avviata, WSAAsyncGetProtoByNumber restituisce un valore zero e un numero di errore specifico può essere recuperato chiamando WSAGetLastError.
I codici di errore seguenti possono essere impostati quando una finestra dell'applicazione riceve un messaggio. Come descritto in precedenza, possono essere estratti dall'oggetto lParam nel messaggio di risposta usando la macro WSAGETASYNCERROR .
Codice di errore | Significato |
---|---|
Il sottosistema di rete non è riuscito. | |
Spazio buffer insufficiente disponibile. | |
Il parametro buf non si trova in una parte valida dello spazio degli indirizzi del processo. | |
Protocollo di risposta autorevole non trovato. | |
Protocollo non autenticativo non trovato o errore del server. | |
Errori non recuperabili, il database dei protocolli non è accessibile. | |
Nome valido, nessun record di dati del tipo richiesto. |
Gli errori seguenti possono verificarsi al momento della chiamata alla funzione e indicano che l'operazione asincrona non può essere avviata.
Codice di errore | Significato |
---|---|
WSANOTINITIALISED | Prima di usare questa funzione, è necessario eseguire una chiamata WSAStartup riuscita. |
WSAENETDOWN | Il sottosistema di rete non è riuscito. |
WSAEINPROGRESS | Una chiamata windows Sockets 1.1 bloccata è in corso oppure il provider di servizi sta ancora elaborando una funzione di callback. |
WSAEWOULDBLOCK | L'operazione asincrona non può essere pianificata in questo momento a causa di risorse o altri vincoli all'interno dell'implementazione di Windows Sockets. |
Commenti
La funzione WSAAsyncGetProtoByNumber è una versione asincrona di getprotobynumber e viene usata per recuperare il nome del protocollo e il numero corrispondenti a un numero di protocollo. Windows Socket avvia l'operazione e restituisce immediatamente al chiamante, passando un handle attività opaco e asincrono che l'applicazione può usare per identificare l'operazione. Al termine dell'operazione, i risultati (se presenti) vengono copiati nel buffer fornito dal chiamante e viene inviato un messaggio alla finestra dell'applicazione.
Al termine dell'operazione asincrona, la finestra dell'applicazione indicata dal parametro hWnd riceve il messaggio nel parametro wMsg . Il parametro wParam contiene l'handle di attività asincrono restituito dalla chiamata di funzione originale. I 16 bit elevati di lParam contengono qualsiasi codice di errore. Il codice di errore può essere qualsiasi errore definito in Winsock2.h. Un codice di errore pari a zero indica il completamento dell'operazione asincrona.
Al termine del completamento, il buffer specificato nella chiamata di funzione originale contiene una struttura protoent . Per accedere ai membri di questa struttura, l'indirizzo del buffer originale viene eseguito il cast in un puntatore della struttura protoent e accessibile in base alle esigenze.
Se il codice di errore è WSAENOBUFS, le dimensioni del buffer specificato da buflen nella chiamata originale erano troppo piccole per contenere tutte le informazioni risultanti. In questo caso, i 16 bit bassi di lParam contengono le dimensioni del buffer necessarie per fornire tutte le informazioni necessarie. Se l'applicazione decide che i dati parziali non sono adeguati, è possibile riemettere la chiamata alla funzione WSAAsyncGetProtoByNumber con un buffer di grandi dimensioni sufficiente per ricevere tutte le informazioni desiderate, ovvero non inferiori ai 16 bit di lParam.
Il buffer specificato per questa funzione viene usato da Windows Sockets per costruire una struttura protoent insieme al contenuto delle aree dati a cui fanno riferimento i membri della stessa struttura protoent . Per evitare l'errore WSAENOBUFS indicato in precedenza, l'applicazione deve fornire un buffer di almeno MAXGETHOSTSTRUCT byte (come definito in Winsock2.h).
Il codice di errore e la lunghezza del buffer devono essere estratti dall'lParam usando le macro WSAGETASYNCERROR e WSAGETASYNCBUFLEN, definite in Winsock2.h come:
#include <windows.h>
#define WSAGETASYNCBUFLEN(lParam) LOWORD(lParam)
#define WSAGETASYNCERROR(lParam) HIWORD(lParam)
L'uso di queste macro ottimizza la portabilità del codice sorgente per l'applicazione.
Requisiti
Requisito | Valore |
---|---|
Client minimo supportato | Windows 2000 Professional [solo app desktop] |
Server minimo supportato | Windows 2000 Server [solo app desktop] |
Piattaforma di destinazione | Windows |
Intestazione | winsock2.h (include Winsock2.h) |
Libreria | Ws2_32.lib |
DLL | Ws2_32.dll |