2010-03-09 7 views
9

Comme nous le savons pour UDP recevoir, nous utilisons Socket.ReceiveFrom ouComment est-ce que je peux placer la taille de mémoire tampon pour le dessous UDP de douille? C#

UdpClient.receive

Socket.ReceiveFrom accepte un tableau d'octets de vous mettre les données dans udp.

UdpClient.receive retourne directement un octet tableau où les données sont

Ma question est que Comment régler la taille de la mémoire tampon à l'intérieur de Socket. Je pense que le système d'exploitation maintient son propre tampon pour recevoir des données UDP, non? par exemple, si un paquet udp est envoyé à ma machine, le système d'exploitation le mettra dans un tampon et nous attendra à Socket.ReceiveFrom ou UdpClient.receive, n'est-ce pas?

Comment puis-je modifier la taille de ce tampon interne?

J'ai essayé Socket.ReceiveBuffSize, il n'a aucun effet pour UDP, et il est clairement dit que c'est pour la fenêtre TCP. J'ai aussi fait beaucoup d'expériences qui prouvent que Socket.ReceiveBufferSize n'est PAS pour UDP.

Quelqu'un peut-il partager quelques idées pour le tampon interne UDP ???

Merci

J'ai vu quelques messages ici, par exemple,

http://social.msdn.microsoft.com/Forums/en-US/ncl/thread/c80ad765-b10f-4bca-917e-2959c9eb102a

Dave dit que Socket.ReceiveBufferSize peut définir la mémoire tampon interne pour UDP. Je ne suis pas d'accord.

L'expérience que je l'ai fait est comme ceci:

27 hôtes envoyer un paquet udp 10KB à moi dans un réseau local en même temps (au moins presque). J'ai une boucle while pour gérer chacun des paquets. Pour chaque paquet, je crée un thread pour le gérer. J'ai utilisé UdpClient ou Socket pour recevoir les paquets.

J'ai perdu environ 50% des paquets. Je pense que c'est une explosion de l'envoi UDP et je ne peux pas gérer tous à temps.

C'est pourquoi je veux augmenter la taille de tampon pour UDP. disons, si je change la taille de la mémoire tampon à 1 Mo, alors 27 * 10 Ko = 270 Ko de données peuvent être acceptées dans le tampon, non?

J'ai essayé de changer Socket.ReceiveBufferSize en beaucoup de nombreuses valeurs, et il n'a tout simplement aucun effet.

Quelqu'un peut-il aider?

Répondre

9

J'utilise souvent le .NET UDPClient et j'ai toujours utilisé le Socket.ReceiveBufferSize et j'ai de bons résultats. En interne, il appelle Socket.SetSocketOption avec le paramètre ReceiveBuffer. Voici une certaine rapide, simple, code que vous pouvez tester avec:

public static void Main(string[] args) 
{ 
    IPEndPoint remoteEp = null; 
    UdpClient client = new UdpClient(4242); 
    client.Client.ReceiveBufferSize = 4096; 

    Console.Write("Start sending data..."); 
    client.Receive(ref remoteEp); 
    Console.WriteLine("Good"); 

    Thread.Sleep(5000); 
    Console.WriteLine("Stop sending data!"); 
    Thread.Sleep(1500); 

    int count = 0; 
    while (true) 
    { 
    client.Receive(ref remoteEp); 
    Console.WriteLine(string.Format("Count: {0}", ++count)); 
    } 
} 

Essayez d'ajuster la valeur passée dans le ReceiveBufferSize. J'ai testé l'envoi d'un flux constant de données pour les 5 secondes, et j'ai reçu 10 paquets. J'ai ensuite augmenté x4 et la prochaine fois eu 38 paquets.

Je voudrais regarder à d'autres endroits dans votre réseau où vous pouvez laisser tomber des paquets. Surtout que vous mentionnez sur votre other post que vous envoyez des paquets de 10 Ko. Les 10 Ko seront fragmentés lorsqu'il sera envoyé à des paquets de la taille de MTU. Si un paquet de la série est supprimé, le paquet entier sera supprimé.

+0

@heavyd: merci pour votre réponse. Mon code est très similaire au vôtre. mais si vous êtes intéressé, vous pouvez faire une expérience simple. nous avons deux classes distinctes - Serveur et Client. dans votre client.cs, vous utilisez simplement UdpClient pour envoyer 200 paquets (10KB chacun) à votre port local 8888. (quel que soit le port que vous voulez) dans votre Server.cs, vous recevez constamment comme indiqué dans votre code bien sûr, lancez d'abord votre server.cs. mon résultat est que 90% des paquets peuvent être reçus. Le point est l'envoi UDP est une salve que trop de paquets arrivent et votre serveur ne peut pas gérer. et le buffer déborde. – Jack

+0

Oui, et dites-vous que l'ajustement de ReceiveBufferSize d'une valeur, disons '4096' à une valeur plus élevée, dire' 4 * 4096' ne fait rien? – heavyd

+0

@ heavyd, puis-je savoir quelle est la limite supérieure de ReceiveBufferSize? – Jack

7

Le problème avec la définition de ReceiveBufferSize est que vous devez le définir directement après la création de l'objet UdpClient. J'ai eu le même problème avec mes modifications ne sont pas reflétées lors de l'obtention de la valeur de ReceiveBufferSize.

UdpClient client = new UdpClient() 
//no code inbetween these two lines accessing client. 
client.Client.ReceiveBufferSize = somevalue 
Questions connexes