c# udp winsock multicast hyper-v

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.