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.receiveSocket.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?
@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
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
@ heavyd, puis-je savoir quelle est la limite supérieure de ReceiveBufferSize? – Jack