首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#异步网络IO和OutOfMemoryException

C#异步网络IO和OutOfMemoryException
EN

Stack Overflow用户
提问于 2010-04-25 17:11:08
回答 1查看 1.5K关注 0票数 3

我正在用C#开发一个客户机/服务器应用程序,我需要让异步套接字工作,这样我才能同时处理多个连接。从技术上讲,它现在是这样工作的,但我在运行大约3分钟后就得到了一个OutOfMemoryException。MSDN说在socket.BeginAccept()之后使用WaitHandler来做WaitOne(),但它实际上不允许我这么做。当我试图在代码中这样做时,它告诉我WaitHandler是一个抽象的类或接口,而我无法实例化它。我想也许我会尝试静态引用,但它没有WaitOne()方法,只有WaitAll()WaitAny()。主要的问题是,在文档中,它没有给出完整的代码片段,所以你实际上看不到他们的“等待处理程序”来自哪里。它只是一个名为allDone的变量,在代码片段中也有一个waithandler没有的Reset()方法。

在仔细研究了他们的文档之后,我发现了一些关于Threading名称空间中的AutoResetEvent的相关内容。它有一个WaitOne()和一个Reset()方法。所以我在while(true) { ... socket.BeginAccept( ... ); ... }上尝试了一下。不幸的是,这使得它一次只需要一个连接。所以我真的不知道该去哪里。下面是我的代码:

代码语言:javascript
复制
 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);
        }
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-04-25 17:28:21

你看过MSDN的例子吗?Asynchronous Server Socket Example

另外:

  • Asynchronous Socket Programming
  • Asynchronous Socket Programming in C#: Part I
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2707731

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档