2010-03-09 33 views
9

Como sabemos para UDP recibir, utilizamos Socket.ReceiveFrom o UdpClient.receive¿Cómo puedo configurar el tamaño del buffer para el Socket UDP inferior? C#

Socket.ReceiveFrom aceptar una matriz de bytes de usted para poner los datos en UDP.

UdpClient.receive regresa directamente un byte matriz donde los datos son

Mi pregunta es cómo configurar el tamaño del búfer dentro de Socket. Creo que el sistema operativo mantiene su propio buffer para recibir datos UDP, ¿verdad? por ejemplo, si se envía un paquete udp a mi máquina, el sistema operativo lo colocará en un buffer y nos esperará a Socket.ReceiveFrom o UdpClient.receive, ¿no?

¿Cómo puedo cambiar el tamaño de ese buffer interno?

He intentado con Socket.ReceiveBuffSize, no tiene ningún efecto para UDP, y claramente dice que es para ventana TCP. También he realizado muchos experimentos que prueban que Socket.ReceiveBufferSize NO es para UDP.

¿Alguien puede compartir algunas ideas para el búfer interno de UDP?

Gracias

que he visto algunos puestos aquí, por ejemplo,

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

de Dave dijeron que Socket.ReceiveBufferSize puede establecer el buffer interno para UDP. Estoy en desacuerdo.

El experimento que hice es así:

27 hosts envían un paquete UDP 10KB a mí dentro de una LAN al mismo tiempo (al menos casi). Tengo un while-loop para manejar cada uno de los paquetes. Para cada paquete, creo un hilo y lo manejo. Usé UdpClient o Socket para recibir los paquetes.

Perdí aproximadamente el 50% de los paquetes. Creo que es una explosión del envío de UDP y no puedo manejarlos a tiempo.

Es por eso que quiero aumentar el tamaño del búfer para UDP. digamos, si cambio el tamaño del buffer a 1MB, entonces se pueden aceptar 27 * 10KB = 270KB de datos en el buffer, ¿verdad?

He intentado cambiar Socket.ReceiveBufferSize a muchos valores, y simplemente no tiene ningún efecto.

Cualquiera puede ayudar?

Respuesta

9

Uso el .NET UDPClient a menudo y siempre he usado el Socket.ReceiveBufferSize y tengo buenos resultados. Internamente llama al Socket.SetSocketOption con el parámetro ReceiveBuffer. Aquí está una cierta rápido, simple, el código se puede probar con:

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)); 
    } 
} 

intente ajustar el valor pasado en el ReceiveBufferSize. Probé enviando un flujo constante de datos durante 5 segundos y obtuve 10 paquetes. Luego aumenté x4 y la próxima vez obtuve 38 paquetes.

Me gustaría mirar a otros lugares en su red donde puede que esté soltando paquetes. Especialmente desde que mencionas en tu other post que estás enviando paquetes de 10KB. Los 10 KB se fragmentarán cuando se envíen a paquetes del tamaño de MTU. Si se descarta un paquete de la serie, se descartará el paquete completo.

+0

@heavyd: gracias por su respuesta. Mi código es muy similar al tuyo. pero si estás interesado, puedes hacer un experimento simple. tenemos dos clases separadas: Servidor y Cliente. en su Client.cs, simplemente use UdpClient para enviar 200 paquetes (10KB cada uno) a su puerto local 8888. (sea cual sea el puerto que desee) en su Server.cs, usted recibe constantemente como se muestra en su código por supuesto, por favor ejecute su servidor.cs primero. mi resultado es el 90% de los paquetes se pueden recibir. El punto es que el envío de UDP es una ráfaga que llegan demasiados paquetes y su servidor no puede manejar. y el buffer se desborda – Jack

+0

Sí, y ¿está diciendo que ajustar ReceiveBufferSize de un valor, digamos '4096' a un valor más alto, decir' 4 * 4096' no hace nada? – heavyd

+0

@heavyd, ¿puedo saber cuál es el límite superior para ReceiveBufferSize? – Jack

7

El problema con la configuración de ReceiveBufferSize es que debe configurarlo directamente después de la creación del objeto UdpClient. Tuve el mismo problema con mis cambios que no se reflejan al obtener el valor de ReceiveBufferSize.

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