Сокеты: иногда (редко) пакеты теряются при получении - PullRequest
2 голосов
/ 22 марта 2012

Я использую Socket для получения данных от многоадресной рассылки udp.Код тривиален:

s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
....
while (true)
{
    int count = 0;
    try
    {
        count = socket.Receive(byteArray);
    }
    catch (Exception e)
    {
        Console.WriteLine(e.Message);
        return;
    }
    if (count > 0)
    {
        OnNewMessage(new NewMessageEventArgs(byteArray, count));
    }
}

Проблема в том, что иногда я теряю пакеты.Не слишком часто, ~ раз в 2 минуты.

Я уверен, что пакет прибыл, потому что я вижу его в другой программе C ++, запущенной на том же компьютере и настроенной на получение тех же пакетов.* Почему моя программа не может поймать пакеты, которые могут другие?Почему я теряю пакеты?Возможно ли, что компьютер слишком медленный (или слишком занят) для приема пакетов?

Я получаю около 2000 пакетов в секунду и использую процессор Xeon E3, этого должно быть более чем достаточно, я думаю ...1011 *

Ответы [ 2 ]

3 голосов
/ 23 марта 2012

Если вы абсолютно уверены, что пакет прибывает (и: я должен подчеркнуть, что это не гарантируется при использовании UDP, и 1 пакет, отброшенный каждые две минуты при 2000 пакетах в секунду, является лучшей скоростью приема чем вы, вероятно, должны надеяться, даже для двух смежных машин), то , возможно, означает, что буфер приема полон в короткие моменты. Попробуйте увеличить ReceiveBufferSize.

0 голосов
/ 22 марта 2012

Не знаю, если это ваш случай, но иногда вы можете получить более одного пакета в одном байтовом массиве сокета. Receive (byteArray). Это связано с оптимизацией сокетов. Проверьте, если это ваш случай, и проверьте ваши методы анализа.

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