2013-03-07 1 views
6

최근 QA 환경 전체가 VMWare에서 Hyper-V 가상 시스템으로 옮겨졌습니다.Hyper-V 시스템에서 소켓 예외가 발생했습니다.

우리의 응용 프로그램 중 하나는 UDP 패킷을 초당 20K 패킷 속도로 멀티 캐스트 클라우드로 보냅니다.

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

가 나는 또한 때 즉시이 문제를 모방하기 위해 관리했습니다 : 그 VM웨어 환경에서 완벽하게 작동하는 동안

은 Hyper-V는 작업의 몇 분 후에 다음과 같은 예외를 던질 수있는 응용 프로그램을 만드는 소켓의 송신 버퍼 크기를 1,000,000 바이트로 정의합니다.

이 문제를 어떻게 해결할 수 있습니까?

UPDATE 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 바이트입니다.

UPDATE 3 : 첫 번째 실패한 보내기()는 # 14156 또는 # 32485 또는 # 25412 패킷에 일어날 것으로 보인다 (하지 :

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

UPDATE 4 : 여기에 문제가있는 코드 하나!) 초당 100K 패킷을 보내려고 할 때.

+0

예외로부터 어떤 SocketErrorCode를 얻습니까? – SpaceghostAli

+2

ErrorCode = 10022, SocketErrorCode = InvalidArgument. –

+1

큰 패킷을 보내려고하면 오류가 발생합니다. 보낼 수있는 최대 UDP 패킷은 약 64K 바이트입니다. 예를 들어 http://stackoverflow.com/q/1098897/56778을 참조하십시오. –

답변

-1

패킷을 "롤업"하여 더 큰 패킷을 훨씬 적게 보낼 수 있습니까? 그런 다음 다른 쪽에서 해제 할 수 있습니까? 20k 패킷/초 sendto 많이 있습니다.

+0

보내기 전에 데이터를 지연하거나 버퍼링 할 수 없습니다. 실제 요구 사항은 VMWare 컴퓨터를 사용하여 실제로 작동하는 100K입니다. –