2010-01-03 8 views
1

je voudrais quelques informations sur les points suivants:C# socket asynchrone BeginSend

Socket.BeginSend Method (array<Byte>[]()[], Int32, Int32, SocketFlags, AsyncCallback, Object) 

client.BeginSend(message, 0, message.Length, SocketFlags.None, new AsyncCallback(SendData), client); 

si le message.lenght est supérieure à la buffersize (32) dois-je invoquer plusieurs fois BeginSend pour transmettre l'ensemble du paquet de données ? Ou est-ce que je fais juste plusieurs lectures à l'autre extrémité jusqu'à ce que la fin de la longueur réelle de tampon soit reçue?

Ceci est une discussion comme im en lisant la documentation avant l'implémentation réelle.

merci.

Répondre

4

La taille de la mémoire tampon n'est pas 32, elle est exactement message.Length comme défini. Vous pouvez confondre Int32 avec la valeur 32.

Dans le cas ci-dessus, tant que la taille réelle du message est inférieure à 2147483648 (2^31), vous pouvez l'envoyer en un seul appel à la méthode.

À l'extrémité de réception vous avez plusieurs choix:

Si la taille du message
  1. ne sait pas, vous pouvez utiliser une boucle pour le lire morceau par morceau jusqu'à ce qu'un Receive appel renvoie moins d'une pleine taille de morceau.
  2. Si le message contient sa longueur dans les premiers octets (c'est-à-dire son en-tête), vous pouvez lire l'en-tête, puis allouer suffisamment d'espace tampon pour lire le message entier en un appel.
  3. Si la taille du message est garantie inférieure à un certain nombre, vous pouvez allouer un tampon suffisamment grand pour garantir la lecture d'un message en un seul appel.
+0

Im juste curieux mais pourquoi n'y a-t-il pas un mecahnism semblable sur la fin de la réception? un moyen d'obtenir le paquet de données data.length réel en une fois au lieu de lire la longueur du tampon (32 par exemple) plusieurs fois pour obtenir les données complètes? J'espère que je suis clair car je suis nouveau à ce sujet. Merci. – iTEgg

+0

Je vais éditer ma réponse pour répondre à cette question ... –

+0

merci. vous avez été très utile. – iTEgg

Questions connexes