最近在完成一个客户要求的udp接受程序的时候,碰到了点问题,具体如下:
客户那边有个程序不停的往我的一台服务器发送数据数据包大概每秒钟10条左右,通过udp协议发送的,小弟再通过udp协议接受客户发送的数据包再每条每条的解析,得到想要的内容,用的udpclient类异步接受数据的方法,BeginReceive,可程序运行不到2分钟就出现“由于系统缓冲区空间不足或列队已满,不能执行套接字上的操作”的错误,后来跟踪错误初步估计是发过来的数据来不及处理或处理话费时间太长,导致缓冲区资源原来越多从而导致溢出,小弟现在不知道如何处理这种情况,迫切希望遇到此种情况的给小弟提供一点帮助思路,谢谢。

解决方案 »

  1.   

    能写出一句 BeginReceive 并不重要,重要地是在它的回调方法中你到底是以什么流程调用下一个 BeginReceive 的呢?比如说private void Received(IAsyncResult h)
    {
    private void Received(IAsyncResult h)
    {
        IPEndPoint remote = null;
        var data = this.EndReceive(h, ref remote);
        this.BeginReceive(Received, null);
        .......  放到最后才去处理data
    }
      

  2.   


     public void ReceiveMsg()
            {
                while(true)
                {
                    //lock (this)
                    //{
                        receiveDone.Reset();
                        try
                        {
                            IAsyncResult iar = udpReceive.BeginReceive(new AsyncCallback(ReceiveCallback), udpReceiveState);
                        }
                        catch (Exception ex)
                        {
                            MessageToLog(ex.Message);
                        }
                        finally
                        {
                            receiveDone.WaitOne();
                        }
                       
                        //Thread.Sleep(100);
                    //}
                }
            }就是这个方法,后来发现原因了,是我自己控制线程出现了问题,不知道这种异步接受程序大家是如何处理的
      

  3.   

    异步你还用锁?那你还不如用同步,估计你的socket是在网上COPY的吧?
      

  4.   

    ReceiveCallback不需要循环。
    ReceiveCallback再调用就好了。
      

  5.   

    那个lock已经注销掉了,是在回调方法里面再调用ReceiveCallback吗?