[英]Socket exception on Hyper-V machine
最近,我們的整個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)
在將套接字的發送緩沖區大小定義為1,000,000字節時,我還設法立即模仿了這個問題。
我該如何解決這個問題?
更新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);
}
}
更新4 :當我嘗試每秒發送100K數據包時,失敗的Send()似乎發生在#14156或#32485或#25412數據包(不是第一個!)上。
你可以“卷起”數據包,以便你發送更少的更大的數據包...然后在另一邊解開它們嗎? 20k包/秒是很多sendto的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.