C # Multicast UDP-пакет отбрасывает при хранении объектов - PullRequest
0 голосов
/ 09 февраля 2019

В настоящее время я подписываюсь на многоадресный UDP.Он передает несколько сообщений, каждое около 80 байтов, в одном максимальном 1000-байтовом пакете.По мере поступления пакетов я разбираю их на объекты, а затем сохраняю в словаре.

Каждый пакет, который я получаю, имеет порядковый номер, чтобы я знал, отбросил ли он какие-либо пакеты.

После получения примерно 10 тыс. Пакетов я начинаю отбрасывать пакеты тут и там.

securityDefinition xyz = new securityDefinition(p1,p2,p3,p4,p5...etc);
if (!secDefs.ContainsKey(securityID))
{
    secDefs.Add(securityID, xyz); //THIS WILL CAUSE DROPS EVENTUALLY
    secDefs.Add(securityID, null); //THIS WORKS JUST FINE
}
else
{
    //A repeat definition is received and assuming all 
    //sequence numbers in the packet line up sequentially, I know i am done

    //However if there is a drop somewhere (gap in sequence number),
    //I know I am missing something
}

securityDefinition - это класс, содержащий примерно 15 дюймов, 10 десятичных знаков и 5 строк (<10 символов каждая). </p>

Существует ли более быстрый способ хранения этих объектов в режиме реального времени, который может поддерживатьс быстрой подачей UDP?Я попытался сделать securityDefinition структурой, я попытался сохранить данные в таблице данных, я попытался добавить secDef в список и очередь.Та же проблема со всеми.

Кажется, единственным узким местом является размещение объектов в словаре.Создание объекта и проверка словаря, чтобы увидеть, существует ли он уже, выглядит неплохо.

РЕДАКТИРОВАТЬ: Чтобы прояснить несколько вещей - определения безопасности приходят с сервера в цикле.Есть приблизительно 1 000 000 определений.Как только они все отправлены, они отправляются снова, снова и снова.Когда моя программа запускается, мне нужно инициализировать все определения.Как только я получу повтор, я знаю, что все готово и могу закрыть эту связь.Однако, если я получаю пакет с порядковым номером 1, а следующий - с порядковым номером 3, я знаю, что отбросил пакет 2 и не могу его восстановить.

1 Ответ

0 голосов
/ 09 февраля 2019
ConcurrentQueue<byte[]> pkts = new ConcurrentQueue<byte[]>();


//IN THE RECEIVER THREAD...
void ProductDefinitionReceiver()
{
    while (!secDefsComplete)
    {
        byte[] data = new byte[1000];
        s.Receive(data);
        pkts.Enqueue(data);
    }
}

//IN A SEPARATE THREAD:
public void processPacketQueue()
{
    int dumped = 0;
    byte[] pkt;
    while (!secDefsComplete)
    {
        while (pkts.TryDequeue(out pkt))
        {
            if (!secDefsComplete)
            {
                //processPkt includes the parsing and inserting the secDef object into the dictionary.
                processPkt(pkt);
            }
            else
            {
                dumped++;
            }
        }
    }

    Console.WriteLine("Dumped: " + dumped);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...