c# - Excepción de socket en la máquina Hyper-V
udp winsock (1)
¿Podrían "enrollar" los paquetes de modo que estén enviando muchos menos paquetes de mayor tamaño ... y luego los desenrollen del otro lado? 20k paquetes / segundo son muchos de Sendto.
Recientemente, todo nuestro entorno de control de calidad se movió de VMWare a las máquinas virtuales Hyper-V.
Una de nuestras aplicaciones envía paquetes UDP a una nube multicast por una tasa de 20K paquetes por segundo.
Si bien eso funcionó perfectamente en el entorno VMWare, el Hyper-V hace que la aplicación arroje la siguiente excepción después de un par de minutos de trabajo:
System.Net.Sockets.SocketException (0x80004005): An invalid argument was supplied
at System.Net.Sockets.Socket.Send(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags)
También me las arreglé para imitar este problema al instante al definir el tamaño del búfer de envío del zócalo en 1,000,000 de bytes.
¿Cómo puedo resolver este problema?
ACTUALIZACIÓN 1 : Esta es una entrada de registro del visor de eventos una vez que ocurre la excepción:
Faulting application name: Agent.exe, version: 1.0.12.7366, time stamp: 0x51389f69
Faulting module name: KERNELBASE.dll, version: 6.1.7601.18015, time stamp: 0x50b83c8a
Exception code: 0xe0434352
Fault offset: 0x0000c41f
Faulting process id: 0xaf0
Faulting application start time: 0x01ce1b4ce509dc7a
Faulting application path: C:/Users/DevUser/Desktop/QA/Agent.exe
Faulting module path: C:/Windows/syswow64/KERNELBASE.dll
Report Id: d2b45dce-8740-11e2-86f9-00155d022804
ACTUALIZACIÓN 2 : El tamaño del paquete UDP es de 100-200 bytes.
ACTUALIZACIÓN 3 : Aquí está el código problemático:
m_socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
m_socket.Ttl = 1;
if (GetRawParameter("send") != null)
{
Log("Starting sender...");
StartSender();
}
...snip...
private static void StartSender()
{
m_lastPacketNumber = 0;
m_socket.Connect(new IPEndPoint(m_ipAddress, m_port));
if (m_bufferSize > 0)
m_socket.SetSocketOption(
SocketOptionLevel.Socket, SocketOptionName.SendBuffer, m_bufferSize);
byte[] dataPad = null;
if (m_packetSize > 8)
{
dataPad = new byte[m_packetSize - sizeof(long)];
for (int i = 0; i < dataPad.Length; i++)
{
dataPad[i] = 0xFF;
}
}
while (true)
{
Log("Sending data...");
for (int i = 0; i < m_packetsPerSec; i++)
{
var data = BitConverter.GetBytes(m_lastPacketNumber.Value);
if (dataPad != null)
data = data.Concat(dataPad).ToArray();
if (m_packetDump != null)
m_packetDump.Add(m_lastPacketNumber.Value);
m_socket.Send(data);
if (m_usePerformanceCounters)
IncreaseSendCounters(1);
m_lastPacketNumber++;
}
Log(m_lastPacketNumber + " packets sent.");
Thread.Sleep(1000);
}
}
ACTUALIZACIÓN 4 : el envío fallido () parece ocurrir en el paquete # 14156 o # 32485 o # 25412 (¡no el primero!) Cuando intento enviar 100K de paquetes por segundo.