C#异步网络IO和OutOfMemoryException
我正在用C#开发一个客户机/服务器应用程序,我需要让异步套接字工作,这样我就可以一次处理多个连接。从技术上讲,它的工作方式与现在一样,但在运行大约3分钟后,我得到了一个C#异步网络IO和OutOfMemoryException,c#,asynchronous,network-programming,C#,Asynchronous,Network Programming,我正在用C#开发一个客户机/服务器应用程序,我需要让异步套接字工作,这样我就可以一次处理多个连接。从技术上讲,它的工作方式与现在一样,但在运行大约3分钟后,我得到了一个OutOfMemoryException。MSDN说在socket.beginaceport()之后使用WaitHandler来执行WaitOne(),但实际上它不允许我这样做。当我尝试在代码中这样做时,它会说WaitHandler是一个抽象类或接口,我无法实例化它。我想我可能会尝试一个静态引用,但它没有WaitOne()方法,只
OutOfMemoryException
。MSDN说在socket.beginaceport()
之后使用WaitHandler
来执行WaitOne()
,但实际上它不允许我这样做。当我尝试在代码中这样做时,它会说WaitHandler
是一个抽象类或接口,我无法实例化它。我想我可能会尝试一个静态引用,但它没有WaitOne()
方法,只有WaitAll()
和WaitAny()
。主要的问题是,在文档中,它没有给出完整的代码片段,因此您实际上看不到它们的“等待处理程序”是从哪里来的。它只是一个名为allDone
的变量,在代码段中还有一个Reset()
方法,waithandler没有这个方法
在翻遍他们的文档后,我在线程
名称空间中找到了一些与自动resetEvent
相关的东西。它有一个WaitOne()
和一个Reset()
方法。所以我在中尝试了这个方法,而(true){…socket.beginacept(…);…}
。不幸的是,这使得一次只需要一个连接。所以我真的不知道该去哪里。这是我的密码:
class ServerRunner
{
private Byte[] data = new Byte[2048];
private int size = 2048;
private Socket server;
static AutoResetEvent allDone = new AutoResetEvent(false);
public ServerRunner()
{
server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint iep = new IPEndPoint(IPAddress.Any, 33333);
server.Bind(iep);
Console.WriteLine("Server initialized..");
}
public void Run()
{
server.Listen(100);
Console.WriteLine("Listening...");
while (true)
{
//allDone.Reset();
server.BeginAccept(new AsyncCallback(AcceptCon), server);
//allDone.WaitOne();
}
}
void AcceptCon(IAsyncResult iar)
{
Socket oldserver = (Socket)iar.AsyncState;
Socket client = oldserver.EndAccept(iar);
Console.WriteLine(client.RemoteEndPoint.ToString() + " connected");
byte[] message = Encoding.ASCII.GetBytes("Welcome");
client.BeginSend(message, 0, message.Length, SocketFlags.None, new AsyncCallback(SendData), client);
}
void SendData(IAsyncResult iar)
{
Socket client = (Socket)iar.AsyncState;
int sent = client.EndSend(iar);
client.BeginReceive(data, 0, size, SocketFlags.None, new AsyncCallback(ReceiveData), client);
}
void ReceiveData(IAsyncResult iar)
{
Socket client = (Socket)iar.AsyncState;
int recv = client.EndReceive(iar);
if (recv == 0)
{
client.Close();
server.BeginAccept(new AsyncCallback(AcceptCon), server);
return;
}
string receivedData = Encoding.ASCII.GetString(data, 0, recv);
//process received data here
byte[] message2 = Encoding.ASCII.GetBytes("reply");
client.BeginSend(message2, 0, message2.Length, SocketFlags.None, new AsyncCallback(SendData), client);
}
}
您看过MSDN示例了吗 此外: