LPFN_TRANSMITPACKETS fonction de rappel (mswsock.h)
La fonction TransmitPackets transmet des données en mémoire ou des données de fichier via un socket connecté. La fonction TransmitPackets utilise le gestionnaire de cache du système d’exploitation pour récupérer les données de fichier, verrouillant la mémoire pendant le temps minimal nécessaire à la transmission et aboutissant à une transmission efficace et performante.
Syntaxe
LPFN_TRANSMITPACKETS LpfnTransmitpackets;
BOOL LpfnTransmitpackets(
SOCKET hSocket,
LPTRANSMIT_PACKETS_ELEMENT lpPacketArray,
DWORD nElementCount,
DWORD nSendSize,
LPOVERLAPPED lpOverlapped,
DWORD dwFlags
)
{...}
Paramètres
hSocket
Handle du socket connecté à utiliser dans la transmission. Bien que le socket n’ait pas besoin d’être un circuit orienté connexion, la destination/l’homologue par défaut doit avoir été établie à l’aide de la fonction connect, WSAConnect, accept, WSAAccept, AcceptEx ou WSAJoinLeaf .
lpPacketArray
Tableau de type TRANSMIT_PACKETS_ELEMENT, décrivant les données à transmettre.
nElementCount
Nombre d’éléments dans lpPacketArray.
nSendSize
Taille, en octets, du bloc de données utilisé dans l’opération d’envoi . Définissez nSendSize sur zéro pour permettre à la couche sockets de sélectionner une taille d’envoi par défaut.
La définition de nSendSize sur 0xFFFFFFF permet à l’appelant de contrôler la taille et le contenu de chaque demande d’envoi , obtenue à l’aide de l’indicateur TP_ELEMENT_EOP dans le tableau TRANSMIT_PACKETS_ELEMENT pointé vers dans le paramètre lpPacketArray . Cette fonctionnalité est utile pour les protocoles de message qui imposent des limitations sur la taille des demandes d’envoi individuelles.
lpOverlapped
Pointeur vers une structure OVERLAPPED. Si le handle de socket spécifié dans le paramètre hSocket a été ouvert en tant que chevauchement, utilisez ce paramètre pour obtenir une opération d’E/S asynchrone (qui se chevauche). Les handles de socket sont ouverts comme étant superposés par défaut.
dwFlags
Ensemble d’indicateurs utilisés pour personnaliser le traitement de la fonction TransmitPackets . Le tableau suivant décrit l’utilisation du paramètre dwFlags .
Valeur | Signification |
---|---|
|
Démarre une déconnexion au niveau du transport une fois que toutes les données de fichier ont été mises en file d’attente pour la transmission. S’applique uniquement aux sockets orientés connexion. La spécification de cet indicateur pour les sockets qui ne prennent pas en charge la sémantique de déconnexion (comme les sockets de datagramme) génère une erreur. |
|
Prépare le handle de socket à réutiliser. Une fois la fonction TransmitPackets terminée, le handle de socket peut être passé à la fonction AcceptEx . Valide uniquement lorsqu’un socket orienté connexion et TF_DISCONNECT sont spécifiés.
Note La transmission de paquets au niveau du socket est soumise au comportement du transport sous-jacent. Par exemple, un socket TCP peut être soumis à l’état de TIME_WAIT TCP, ce qui entraîne le retard de l’appel TransmitPackets .
|
|
Demande à Winsock d’utiliser le thread par défaut du système pour traiter de longues requêtes TransmitPackets . Les requêtes Long TransmitPackets sont définies comme des requêtes qui nécessitent plus d’une seule lecture à partir du fichier ou d’un cache ; la définition de la requête longue dépend donc de la taille du fichier et de la longueur spécifiée du paquet d’envoi.
Le thread par défaut du système peut être ajusté à l’aide du paramètre de Registre suivant en tant que REG_DWORD :HKEY_LOCAL_MACHINE\ ParamètresAFD\\currentControlSet\ Services \TransmitWorker |
|
Demande à Winsock d’utiliser des threads système pour traiter de longues requêtes TransmitPackets . Les requêtes Long TransmitPackets sont définies comme des requêtes qui nécessitent plus d’une seule lecture à partir du fichier ou d’un cache ; la définition de la requête longue dépend donc de la taille du fichier et de la longueur spécifiée du paquet d’envoi. |
|
Demande à Winsock d’utiliser des appels de procédure asynchrone (API) de noyau au lieu de threads de travail pour traiter les longues requêtes TransmitPackets . Les requêtes Long TransmitPackets sont définies comme des requêtes qui nécessitent plus d’une seule lecture à partir du fichier ou d’un cache ; la définition de la requête longue dépend donc de la taille du fichier et de la longueur spécifiée du paquet d’envoi. Pour plus d'informations, consultez la section Notes. |
Valeur retournée
Si la fonction TransmitPackets réussit, la valeur de retour est TRUE. Sinon, la valeur renvoyée est FALSE. Pour obtenir des informations d’erreur étendues, appelez WSAGetLastError. Un code d’erreur de WSA_IO_PENDING ou ERROR_IO_PENDING indique que l’opération qui se chevauche a été lancée avec succès et que l’achèvement sera indiqué ultérieurement. Tout autre code d’erreur indique que l’opération qui se chevauche n’a pas été lancée avec succès et qu’aucune indication d’achèvement ne se produira. Dans ce cas, les applications doivent gérer ERROR_IO_PENDING ou WSA_IO_PENDING.
Code de retour | Description |
---|---|
Une connexion établie a été abandonnée par un logiciel de votre ordinateur hôte. Cette erreur est retournée si le circuit virtuel a été arrêté en raison d’un délai d’attente ou d’une autre défaillance. | |
une connexion existante a dû être fermée par l’hôte distant. Cette erreur est retournée pour un socket de flux lorsque le circuit virtuel a été réinitialisé par le côté distant. L’application doit fermer le socket, car il n’est plus utilisable. | |
Le système a détecté une adresse de pointeur non valide lors de la tentative d’utilisation d’un argument pointeur dans un appel. Cette erreur est retournée si le paramètre lpPacketArray ou lpOverlapped n’est pas entièrement contenu dans une partie valide de l’espace d’adressage utilisateur. | |
Argument non valide fourni. Cette erreur est retournée si le paramètre dwFlags a l’indicateur TF_REUSE_SOCKET défini, mais que l’indicateur TF_DISCONNECT n’a pas été défini. Cette erreur est également retournée si le décalage spécifié dans la structure OVERLAPPED pointée par lpOverlapped ne se trouve pas dans le fichier. Cette erreur est également retournée si le nombre total d’octets à transmettre est une valeur supérieure à 2 147 483 646, la valeur maximale d’un entier 32 bits moins 1. | |
Une opération de socket a rencontré un réseau mort. Cette erreur est retournée si le sous-système réseau a échoué. | |
La connexion a été interrompue, car l'activité persistante a détecté un échec en cours d'opération. Cette erreur est retournée pour un socket de flux où la connexion a été interrompue en raison d’une activité de maintien en vie détectant une défaillance. | |
Impossible d’effectuer une opération sur un socket, car le système n’avait pas suffisamment d’espace de mémoire tampon ou car une file d’attente était pleine. Cette erreur est également retournée si le fournisseur Windows Sockets signale un blocage de mémoire tampon. | |
Une demande d’envoi ou de réception de données a été refusée, car le socket n’est pas connecté. Cette erreur est retournée pour un socket de flux. | |
Une opération a été tentée sur un objet qui n’est pas un socket. Cette erreur est retournée si le paramètre hSocket n’est pas un socket. | |
Une demande d'envoi ou de réception de données n'a pas été autorisée car le socket avait déjà été éteint dans cette direction par un appel d'arrêt précédent. Cette erreur est retournée si un socket de flux a été arrêté pour l’envoi. Il n’est pas possible d’appeler TransmitFile sur un socket de flux après que la fonction d’arrêt a été appelée sur le socket avec le paramètre how défini sur SD_SEND ou SD_BOTH. | |
Soit l’application n’a pas appelé la fonction WSAStartup , soit WSAStartup a échoué. Un appel WSAStartup réussi doit se produire avant d’utiliser la fonction TransmitFile . | |
Une opération d’E/S qui se chevauche est en cours. Cette valeur est retournée si une opération d’E/S qui se chevauche a été lancée avec succès et indique que l’achèvement sera indiqué ultérieurement. | |
L'opération d'E/S a été abandonnée en raison de l'arrêt d'un thread ou de la requête d'une application. Cette erreur est retournée si l’opération qui a été chevauchée a été annulée en raison de la fermeture du socket, de l’exécution de la commande « SIO_FLUSH » dans WSAIoctl ou du thread qui a lancé la demande superposée a été arrêté avant la fin de l’opération.
Note Toutes les E/S initiées par un thread donné sont annulées à la sortie de ce thread. Pour les sockets qui se chevauchent, les opérations asynchrones en attente peuvent échouer si le thread est fermé avant la fin des opérations asynchrones. Pour plus d’informations, consultez ExitThread.
|
Remarques
La fonction TransmitPackets est optimisée en fonction du système d’exploitation sur lequel elle est utilisée :
- Sur les éditions de serveur Windows, la fonction TransmitPackets est optimisée pour des performances élevées.
- Sur les éditions du client Windows, la fonction TransmitPackets est optimisée pour une utilisation minimale de la mémoire et des ressources.
Le nombre maximal d’octets pouvant être transmis à l’aide d’un seul appel à la fonction TransmitPackets est de 2 147 483 646, la valeur maximale d’un entier 32 bits moins 1. Si une application doit transmettre des données supérieures à 2 147 483 646 octets, plusieurs appels à la fonction TransmitPackets peuvent être utilisés, chaque appel ne transférant pas plus de 2 147 483 646 octets.
Attendez-vous à de meilleurs résultats en matière de performances lors de l’utilisation de la fonction TransmitPackets sur Windows Server 2003.
Lorsque lpOverlapped n’a pas la valeur NULL, il se peut que les E/S qui se chevauchent ne se terminent pas avant le retour de la fonction TransmitPackets . Lorsque cela se produit, la fonction TransmitPackets retourne un échec et un appel à la fonction WSAGetLastError retourne ERROR_IO_PENDING, ce qui permet à l’appelant de continuer le traitement une fois la transmission terminée.
TransmitPackets et les appels de procédure asynchrone (API)
L’utilisation de l’indicateur TF_USE_KERNEL_APC peut offrir des avantages significatifs en matière de performances. Si le thread à l’origine de l’appel de fonction TransmitPackets est utilisé pour des calculs lourds, il est possible, bien que peu probable, que des API soient empêchés de se lancer.
- Les API du noyau démarrent lorsqu’un thread est en état d’attente.
- Les API en mode utilisateur démarrent lorsqu’un thread est dans un état d’attente pouvant être alerté.
Windows 8.1 et Windows Server 2012 R2 : cette fonction est prise en charge pour les applications du Windows Store sur Windows 8.1, Windows Server 2012 R2 et versions ultérieures.
Configuration requise
Condition requise | Valeur |
---|---|
Client minimal pris en charge | Windows 8.1, Windows Vista [applications de bureau | Applications UWP] |
Serveur minimal pris en charge | Windows Server 2003 [applications de bureau | applications UWP] |
Plateforme cible | Windows |
En-tête | mswsock.h |