Exporter (0) Imprimer
Développer tout

Socket.BeginSendTo, méthode

Mise à jour : novembre 2007

Envoie des données de façon asynchrone à un hôte distant spécifique.

Espace de noms :  System.Net.Sockets
Assembly :  System (dans System.dll)

[HostProtectionAttribute(SecurityAction.LinkDemand, ExternalThreading = true)]
public IAsyncResult BeginSendTo(
	byte[] buffer,
	int offset,
	int size,
	SocketFlags socketFlags,
	EndPoint remoteEP,
	AsyncCallback callback,
	Object state
)
/** @attribute HostProtectionAttribute(SecurityAction.LinkDemand, ExternalThreading = true) */
public IAsyncResult BeginSendTo(
	byte[] buffer,
	int offset,
	int size,
	SocketFlags socketFlags,
	EndPoint remoteEP,
	AsyncCallback callback,
	Object state
)
public function BeginSendTo(
	buffer : byte[], 
	offset : int, 
	size : int, 
	socketFlags : SocketFlags, 
	remoteEP : EndPoint, 
	callback : AsyncCallback, 
	state : Object
) : IAsyncResult

Paramètres

buffer
Type : System.Byte[]

Tableau de type Byte qui contient les données à envoyer.

offset
Type : System.Int32

Position de base zéro dans buffer à laquelle commencer l'envoi des données.

size
Type : System.Int32

Nombre d'octets à envoyer.

socketFlags
Type : System.Net.Sockets.SocketFlags

Combinaison d'opérations de bits des valeurs SocketFlags.

remoteEP
Type : System.Net.EndPoint

EndPoint qui représente le périphérique distant.

callback
Type : System.AsyncCallback

Délégué AsyncCallback.

state
Type : System.Object

Objet contenant les informations d'état de cette demande.

Valeur de retour

Type : System.IAsyncResult

IAsyncResult qui fait référence à l'envoi asynchrone.

ExceptionCondition
ArgumentNullException

buffer est null.

– ou –

remoteEP est null.

SocketException

Une erreur s'est produite lors de la tentative d'accès au socket. Pour plus d'informations, consultez la section Notes.

ArgumentOutOfRangeException

offset est inférieur à 0.

– ou –

offset est supérieur à la longueur de buffer.

– ou –

size est inférieur à 0.

– ou –

size est supérieur à la longueur de buffer moins la valeur du paramètre offset.

ObjectDisposedException

Socket a été fermé.

SecurityException

Un appelant situé plus haut dans la pile des appels n'a pas l'autorisation pour l'opération demandée.

Remarque :

L'attribut HostProtectionAttribute appliqué à ce type ou membre a la valeur de propriété Resources suivante : ExternalThreading. HostProtectionAttribute n'affecte pas les applications bureautiques (qui sont généralement démarrées en double-cliquant sur une icône, en tapant une commande ou en entrant une URL dans un navigateur). Pour plus d'informations, consultez la classe HostProtectionAttribute ou Attributs de programmation et de protection des hôtes SQL Server.

La méthode BeginSendTo démarre une opération d'envoi asynchrone à l'hôte distant spécifié dans le paramètre remoteEP. L'appel à la méthode BeginSendTo vous permet d'envoyer les données dans un thread d'exécution séparé. Bien que destiné aux protocoles sans connexion, BeginSendTo fonctionne avec les protocoles orientés connexion.

Vous pouvez créer une méthode de rappel qui implémente le délégué AsyncCallback et passe son nom à la méthode BeginSendTo. Pour ce faire, au minimum, votre paramètre state doit contenir le Socket connecté ou par défaut utilisé pour la communication. Si votre rappel a besoin d'informations supplémentaires, vous pouvez créer une petite classe contenant Socket et les autres informations requises. Passez une instance de cette classe à la méthode BeginSendTo via le paramètre state.

Votre méthode de rappel doit appeler la méthode EndSendTo. Lorsque votre application appelle BeginSendTo, le système utilise un thread séparé pour exécuter la méthode de rappel spécifiée et se bloque sur EndSendTo jusqu'à ce que Socket envoie le nombre d'octets demandé ou lève une exception. Si vous voulez que le thread d'origine se bloque après que vous avez appelé la méthode BeginSendTo, utilisez la méthode WaitHandle.WaitOne. Appelez la méthode Set sur un T:System.Threading.ManualResetEvent dans la méthode de rappel lorsque vous souhaitez que le thread d'origine continue à s'exécuter. Pour plus d'informations sur l'écriture de méthodes de rappel, consultez Callback, exemple.

Si vous utilisez un protocole orienté connexion, vous devez préalablement appeler la méthode Connect, BeginConnect, Accept ou BeginAccept, sinon la méthode BeginSendTo lève SocketException. La méthode BeginSendTo ignore le paramètre remoteEP et envoie les données au EndPoint établi dans la méthode Connect, BeginConnect, Accept ou BeginAccept.

Si vous utilisez un protocole sans connexion, vous n'avez pas besoin d'établir un hôte distant par défaut avec la méthode Connect ou BeginConnect avant d'appeler la méthode SendTo. Cela est nécessaire uniquement si vous avez l'intention d'appeler la méthode BeginSend. Si vous appelez la méthode Connect ou BeginConnect avant d'appeler la méthode SendTo, le paramètre remoteEP se substituera à l'hôte distant par défaut spécifié pour cette opération d'envoi seulement. En outre, il n'est pas nécessaire d'appeler la méthode Bind. Dans ce cas, le fournisseur de services sous-jacent assigne l'adresse réseau locale et le numéro de port les plus appropriés. Utilisez le numéro de port zéro si vous souhaitez que le fournisseur de services sous-jacent sélectionne un port libre. Si vous devez identifier l'adresse réseau locale et le numéro de port assignés, vous pouvez utiliser la propriété LocalEndPoint après que la méthode EndSendTo s'est terminée correctement.

Si vous voulez envoyer des données à une adresse de diffusion, vous devez préalablement appeler la méthode SetSocketOption et définir l'option de socket en lui assignant le champ SocketOptionName.Broadcast. Vous devez également vous assurer que la taille de votre mémoire tampon n'excède pas la taille de paquet maximale du fournisseur de services sous-jacent. Si tel est le cas, le datagramme n'est pas envoyé et EndSendTo lève SocketException.

Si vous spécifiez l'indicateur DontRoute comme paramètre socketflags, les données que vous envoyez ne seront pas routées.

Remarque :

Si vous recevez SocketException, utilisez la propriété SocketException.ErrorCode pour obtenir le code d'erreur spécifique. Une fois que vous avez obtenu ce code, reportez-vous à la documentation sur les codes d'erreur de l'API Windows Sockets version 2 dans MSDN Library pour obtenir une description détaillée de l'erreur.

Remarque :

Ce membre génère des informations de traçage lorsque vous activez le traçage réseau dans votre application. Pour plus d'informations, consultez Network Tracing.

Remarque :

Le contexte d'exécution (le contexte de sécurité, l'utilisateur personnifié et le contexte d'appel) est mis en cache pour les méthodes Socket asynchrones. Après la première utilisation d'un contexte particulier (une méthode Socket asynchrone spécifique, une instance de Socket spécifique et un rappel spécifique), on constatera une amélioration des performances lors des utilisations suivantes de ce contexte.

L'exemple de code suivant envoie de façon asynchrone des données à l'hôte distant spécifié.

	IPHostEntry lipa = Dns.Resolve("host.contoso.com");
	IPEndPoint lep = new IPEndPoint(lipa.AddressList[0], 11000);

       Socket s = new Socket(lep.Address.AddressFamily,
       	                           SocketType.Stream,
                                         ProtocolType.Tcp);
       try{

                 while(true){
                 allDone.Reset();

                 byte[] buff = Encoding.ASCII.GetBytes("This is a test");

                 Console.WriteLine("Sending Message Now..");
                 s.BeginSendTo(buff, 0, buff.Length, 0, lep, new AsyncCallback(Async_Send_Receive.SendTo_Callback), s);

                 allDone.WaitOne();
            }
       }
       catch (Exception e){
            Console.WriteLine(e.ToString());
       }


IPHostEntry lipa = Dns.Resolve("host.contoso.com");
IPEndPoint lep = new IPEndPoint(lipa.get_AddressList()[0], 11000);

Socket s = new Socket(lep.get_Address().get_AddressFamily(),
    SocketType.Stream, ProtocolType.Tcp);
try {
    while (true) {
        allDone.Reset();
        ubyte buff[] = Encoding.get_ASCII().GetBytes("This is a test");

        Console.WriteLine("Sending Message Now..");
        s.BeginSendTo(buff, 0, buff.length, (SocketFlags)0, lep,
            new AsyncCallback(Async_Send_Receive.SendTo_Callback), s);

        allDone.WaitOne();
    }
}
catch (System.Exception e) {
    Console.WriteLine(e.ToString());
}


Windows Vista, Windows XP SP2, Windows XP Media Center Edition, Windows XP Professionnel Édition x64, Windows XP Starter Edition, Windows Server 2003, Windows Server 2000 SP4, Windows Millennium Edition, Windows 98, Windows CE, Windows Mobile pour Smartphone, Windows Mobile pour Pocket PC

Le .NET Framework et le .NET Compact Framework ne prennent pas en charge toutes les versions de chaque plateforme. Pour obtenir la liste des versions prises en charge, consultez Configuration requise du .NET Framework.

.NET Framework

Pris en charge dans : 3.5, 3.0, 2.0, 1.1, 1.0

.NET Compact Framework

Pris en charge dans : 3.5, 2.0, 1.0

Ajouts de la communauté

AJOUTER
Afficher:
© 2014 Microsoft