2013-03-07 35 views
6

Son zamanlarda, tüm QA ortamımız VMWare'den Hyper-V sanal makinelere taşındı.Hyper-V makinede soket istisnası

Uygulamalarımızdan biri UDP paketlerini, çok noktaya yayın bulutuna saniyede 20 K paket hızında gönderir.

System.Net.Sockets.SocketException (0x80004005): An invalid argument was supplied 
    at System.Net.Sockets.Socket.Send(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags) 

Ben de zaman anında bu sorunu taklit başardınız: o VMWare ortamında mükemmel çalıştı ederken

, Hyper-V işin bir kaç dakika sonra aşağıdaki istisnası vermesine yapar Soketin gönderme arabelleği boyutunu 1.000.000 bayta tanımlayan.

Bu sorunu nasıl çözebilirim?

UPDATE 1: durum gerçekleşirse bu olay görüntüleyici bir günlük girdisi:

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 

GÜNCELLEME 2: UDP paket boyutu 100-200 bayttır.

GÜNCELLEME 3: İlk başarısız Gönder() # 14156 veya # 32485 veya # 25412 paket ortaya çıkıyormuş gibi görünüyorsa (değil:

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

GÜNCELLEME 4: İşte sorunlu koddur Bir!) Saniyede 100K paket göndermeye çalıştığımda.

+0

İstisnadan ne tür SocketErrorCode kullanıyorsunuz? – SpaceghostAli

+2

ErrorCode = 10022, SocketErrorCode = InvalidArgument. –

+1

Elbette, büyük bir paket göndermeye çalıştığınızda bir hata alırsınız. Gönderebileceğiniz en büyük UDP paketi yaklaşık 64K bayttır. Örneğin, http://stackoverflow.com/q/1098897/56778 adresine bakın. –

cevap

-1

Paketleri "daha fazla büyük boyutlu paketler gönderiyorsunuz ... ve daha sonra diğer tarafa geri döndürmek için" yuvarlayabilir misiniz? 20k paket/saniye çok çok

+0

Verileri göndermeden önce geciktiremiyorum veya tamponlayamıyorum. Gerçek gereksinim, aslında VMWare makineleri kullanılarak çalışan 100K'dır. –