.NET UDP Socket Send увеличивает использование памяти - PullRequest
2 голосов
/ 22 августа 2011

Я вижу проблему, когда у меня есть UDP-клиент и сервер, обменивающийся сообщениями часто, и использование памяти для обоих объектов увеличивается со скоростью приблизительно 8 КБ в секунду (хотя, в конечном счете, это зависит от скорости обмена данными между ними), как указано в диспетчере задач.

Чтобы проиллюстрировать это как можно проще, я создал образец на основе MSDN с использованием служб UDP http://msdn.microsoft.com/en-us/library/tst0kwb1.aspx.

Сервер:

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

public class UDPListener
{
private const int listenPort = 11000;

private static void StartListener()
{
    bool done = false;

    UInt32 count = 0;
    UdpClient listener = new UdpClient(listenPort);
    IPEndPoint groupEP = new IPEndPoint(IPAddress.Loopback, listenPort);

    try
    {
        while (!done)
        {
            byte[] bytes = listener.Receive(ref groupEP);

            if ("last packet" == System.Text.Encoding.UTF8.GetString(bytes))
            {
                done = true;
                Console.WriteLine("Done! - rx packet count: " + Convert.ToString(count));
            }
            else
            {
                count++;
            }
        }

    }
    catch (Exception e)
    {
        Console.WriteLine(e.ToString());
    }
    finally
    {
        listener.Close();
    }
}

public static int Main()
{
    StartListener();

    return 0;
}

}

И клиент:

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

namespace UDPSender
{
class Program
{
    static void Main(string[] args)
    {
        Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram,
            ProtocolType.Udp);

        IPAddress broadcast = IPAddress.Parse(IPAddress.Loopback.ToString());

        byte[] sendbuf = Encoding.ASCII.GetBytes("test string");
        IPEndPoint ep = new IPEndPoint(broadcast, 11000);

        for (int i = 0; i < 500; i++)
        {
           s.SendTo(sendbuf, ep);

            System.Threading.Thread.Sleep(50);
        }

        s.SendTo(Encoding.ASCII.GetBytes("last packet"), ep);

        s.Dispose();
    }
}
}

Я пробовал использовать прямой интерфейс Socket и UDPClient, отбрасывая сокет клиента после каждой передачи, явный GC.Собирать и т. Д. Безрезультатно.

Любые идеи, что здесь происходит - я не могу поверить, что это фундаментальная проблема с .NET, должна быть проблема с моим кодом / образцом ....

1 Ответ

0 голосов
/ 22 августа 2011

Попробуйте это:

bytes = null;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...