C# Hyper-V计算机上的套接字异常

C# Hyper-V计算机上的套接字异常,c#,udp,winsock,multicast,hyper-v,C#,Udp,Winsock,Multicast,Hyper V,最近,我们的整个QA环境从VMWare转移到Hyper-V虚拟机 我们的一个应用程序以每秒20K个数据包的速率向多播云发送UDP数据包 虽然这在VMWare环境中非常有效,但Hyper-V使应用程序在几分钟的工作后引发以下异常: System.Net.Sockets.SocketException (0x80004005): An invalid argument was supplied at System.Net.Sockets.Socket.Send(Byte[] buffer, I

最近,我们的整个QA环境从VMWare转移到Hyper-V虚拟机

我们的一个应用程序以每秒20K个数据包的速率向多播云发送UDP数据包

虽然这在VMWare环境中非常有效,但Hyper-V使应用程序在几分钟的工作后引发以下异常:

System.Net.Sockets.SocketException (0x80004005): An invalid argument was supplied
   at System.Net.Sockets.Socket.Send(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags)
我还设法在将套接字的发送缓冲区大小定义为1000000字节时立即模拟这个问题

我如何解决这个问题

更新1:一旦发生异常,这是来自事件查看器的日志条目:

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
更新2:UDP数据包的大小为100-200字节

更新3:以下是问题代码:

    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);
  }
}
m_socket=新套接字(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);
m_socket.Ttl=1;
如果(GetRawParameter(“发送”)!=null)
{
日志(“启动发送方…”);
StartSender();
}
剪
私有静态void StartSender()
{
m_lastPacketNumber=0;
m_socket.Connect(新的IPEndPoint(m_IP地址,m_端口));
如果(m_bufferSize>0)
m_插座。设置插座选项(
SocketOptionLevel.Socket,SocketOptionName.SendBuffer,m_bufferSize);
字节[]数据板=null;
如果(m_包装尺寸>8)
{
dataPad=新字节[m_packetSize-sizeof(long)];
对于(int i=0;i

更新4:当我尝试每秒发送100K个数据包时,失败的发送()似乎发生在#14156或#32485或#25412数据包上(不是第一个!)。

你能“卷起”数据包,以便发送的数据包大得多…然后在另一侧取消卷起它们吗?每秒20k个数据包的发送量很大。

ErrorCode=10022,SocketErrorCode=InvalidArgument。当然,当您尝试发送这么大的数据包时,会出现错误。可以发送的最大UDP数据包约为64K字节。例如,请参见。我指的是您的代码传递给
System.Net.Sockets.Socket.Send()
的参数。或者,如果不直接调用该函数,则在引发异常之前调用的最后一个.NET framework函数的名称和参数。data.length=100,异常发生在Win32Api调用上,并返回上述错误代码。我的测试应用程序只使用一个线程-这里没有问题。在发送数据之前,我不能延迟或缓冲数据。实际需求是100K,这实际上可以使用VMWare机器工作。