繁体   English   中英

异步tcp伺服器内存不断增长,并且有时在接收时收到10054错误

Async tcp sever memory keeps on growing and also getting 10054 error on endreceive sometime

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

除了以惊人的速度增加内存使用量之外,在接收结束时我还收到“远程主机10054关闭了现有连接”,并且pgm停止了。 请帮忙
谢谢

我有一个TCP套接字服务器,它工作正常。 但是工作内存从10 MB增长到250 MB。

我监视了nestat是否有任何closed_wait套接字,但是没有找到任何套接字?

有人可以帮我吗? 它必须处理许多连接而不会发生内存泄漏。

StartListen的代码

void StartListen(object sender, System.EventArgs e)
{
    try
    {
        string portStr = textBoxPort.Text;
        int port = System.Convert.ToInt32(portStr);
        // Create the listening socket...
        m_mainSocket = new Socket(AddressFamily.InterNetwork,
            SocketType.Stream,
            ProtocolType.Tcp);
        IPEndPoint ipLocal = new IPEndPoint(IPAddress.Any, port);

        m_mainSocket.Bind(ipLocal);

        m_mainSocket.Listen(100);

        m_mainSocket.BeginAccept(new AsyncCallback(OnClientConnect),null);

        UpdateControls(true);
    }
    catch (SocketException se)
    {
        writer.WriteToLog("In StartListen " + se.Message);
    }
}

public void OnClientConnect(IAsyncResult asyn)
{
    try
    {
        Socket m_mainSocket = (Socket)asyn.AsyncState;

        Socket workerSocket = m_mainSocket.EndAccept(asyn);
        Interlocked.Increment(ref m_clientCount);

        m_workerSocketList.Add(workerSocket);

        WaitForData(workerSocket, m_clientCount);

        m_mainSocket.BeginAccept(new AsyncCallback(OnClientConnect), null);
    }
    catch (ObjectDisposedException)
    {
        System.Diagnostics.Debugger.Log(0, "1", "\n OnClientConnection: Socket has been closed\n");
    }
    catch (Exception se)
    {
        writer.WriteToLog(DateTime.Now.ToString() + " OnClientConnect " + se.Message);
    }
}

public void OnDataReceived(IAsyncResult asyn)
{
    // Logger.Log("In OnDataReceived");
    SocketPacket socketData = (SocketPacket)asyn.AsyncState;
    bool socketClosed = false;


    try
    {
        // Complete the BeginReceive() asynchronous call by EndReceive() method
        // which will return the number of characters written to the stream 
        // by the client
        int iRx = socketData.m_currentSocket.EndReceive(asyn);
        char[] chars = new char[iRx + 1];
        // Extract the characters as a buffer
        System.Text.Decoder d = System.Text.Encoding.UTF8.GetDecoder();
        int charLen = d.GetChars(socketData.dataBuffer,
            0, iRx, chars, 0);




        System.String szData = new System.String(chars);
            szData= szData.TrimEnd('\0');




             if (!SocketExtensions.IsConnected(socketData.m_currentSocket)) {

            socketData.m_currentSocket.Shutdown(SocketShutdown.Both);
            socketData.m_currentSocket.Close();
                              return;
               } 

        else
        {

            WaitForData(socketData.m_currentSocket, socketData.m_clientNumber);
        }
    }
    catch (ObjectDisposedException)
    {
        System.Diagnostics.Debugger.Log(0, "1", "\nOnDataReceived: Socket has been closed\n");
    }
    catch (SocketException se)
    {
        if (se.ErrorCode == 10054) // Error code for Connection reset by peer
        {
            string msg = "Client " + socketData.m_clientNumber + " Disconnected" + "\n";

            // Remove the reference to the worker socket of the closed client
            // so that this object will get garbage collected
            m_workerSocketList[socketData.m_clientNumber - 1] = null;
            UpdateClientListControl();
        }
        else
        {
            MessageBox.Show(se.Message);
           // Logger.Log(se.Message);
            writer.WriteToLog("OnDataReceived " + se.Message);

        }
    }
    catch (Exception ex)
    {
       // Logger.Log(ex.Message);
        writer.WriteToLog("OnDataReceived " + ex.Message);
    }
}
static class SocketExtensions
{
    public static bool IsConnected(this Socket socket)
    {
        try
        { 
            return !(socket.Poll(1, SelectMode.SelectRead) && socket.Available == 0);
        }
        catch (SocketException) { return false; }
    }
}
1 个回复

.NET应用程序的内存占用量增长到一定大小没有任何问题,只要它不会持续增长即可。 根据工作负载,TCP服务器每次接受新客户端并发送/接收数据时都会分配许多对象。 即使不再使用它们,这些对象也会在内存中保留一段时间,直到GC释放它们。 这并不意味着存在内存泄漏。

如果内存使用量增长太多,导致您遇到系统内存问题,请确保在处理客户端请求时不要以某种方式保留创建的某些对象。

1 TCP套接字+ send()错误#10054

我正在研究将文件发送到其他设备的示例应用程序。 我的窗口上有2个按钮,一个是发送按钮,另一个是停止文件传输。 发送; 将文件发送到目的地,然后停止:停止发送过程。 当我将多个文件发送到目标位置时,所有文件都正确到达目标位置。 但是,如果我单击发送并重复停止3到4次(即最初单击发送, ...

2 GradientDescentOptimizer错误持续增长

我正在尝试使用GradientDescentOptimizer进行线性回归,但是得到的结果是我的错误确实增长很快,然后溢出。 我究竟做错了什么? 这是每次迭代时我的错误的示例结果: 这是我的代码 我使用公式y = (0.5 * x_1) + (3 * x_2)生成了数据, ...

3 coreAnimation内存分配不断增长

我是一名经验丰富的程序员,但是IOS的新手试图结束游戏并遇到内存不足的麻烦。 我看到的问题可以用几乎没有自定义代码的方式简单地重现:为简化起见,我从开箱即用的苹果示例项目openGlGame开始,该项目生成旋转多维数据集的单个视图。 然后,我在旋转的多维数据集视图/控制器前面添加了一个启 ...

4 iOS-脏内存持续增长

在我的应用程序中,我使用AFNetworking显示了许多来自URL的图像,以将它们异步加载到UICollectionView中。 可能太多,因为一段时间后应用程序由于内存压力而崩溃。 但是使用Instruments,在“所有堆分配”下,我看不到任何内存泄漏。 但是,VM脏内存不断增长 ...

5 图像IO内存不断增长

我使用VM Tracker在Instruments中运行我的应用程序,发现了不断增长的Image IO内存消耗。 实际上,应用程序通过initWithContentsOfFile:从磁盘上读取了相当多的图像initWithContentsOfFile: 。 我曾经读过这个方法是撒旦的产 ...

6 iPhone应用程序内存不断增长

我已准备好将我的第一个应用程序提交到应用程序商店。 检查泄漏,在设备上测试,工程。 我想确保我的记忆得到控制,所以我运行了分配,唉,没有任何东西可以控制。 我测试了我的应用程序的多个区域,但我专注于几个大的领域,用户继续使用可能会使内存失控非常容易。 对我来说,Allocations ...

7 Joblib 内存使用量不断增长

我有以下问题。 我的目的是处理一堆文档(将所有单词转换为正常形式,例如 'was' --> 'be', 'were' --> 'be', 'went' --> 'go')。 这意味着,我需要打开目录中的每个文件,更改其内容并将其保存在另一个目录中。 由于这个过程很耗时,我决定在jo ...

8 iOS Memory Heap持续增长

我希望这只是我无法弄清楚的一些简单事情。 我有一个带有类扩展的核心数据模型。 因此,这将在上下文和po2实体名称中返回一个新项目。 大。 如果我从以下代码调用此类扩展: 我将对象插入到上下文中,将其保存,但是堆只会越来越大。 如果此日志每秒运行一次或每分钟运行一次 ...

9 记忆力不断增长,但没有泄漏

我有一个内存密集的应用程序...核心图形例程和自定义像素处理例程中的大量图像处理。 据我所知,我对内存一直非常小心,但是我的应用程序运行的时间越长,我注意到Xcode 5中的内存报告中的内存减慢了。我在Instruments中运行了很多次,我看不到任何泄漏。 关于如何调试这个或我可以 ...

10 无法停止异步TCP服务器Windows服务

我有一个在.net 4.0中使用异步服务器套接字开发的TCP服务器Windows服务。 它工作,但大约90%的时间我根本无法阻止它:在Windows服务控制台中按下停止按钮后,它会在大约一分钟后挂起并停止,但其过程继续,TCP通信继续。 它挂在_listener.Close()。 我只 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2021 STACKOOM.COM