UDP-клиент получает только 1 сообщение - PullRequest
0 голосов
/ 15 августа 2011

У меня есть серверное клиентское приложение, над которым я сейчас работаю.Сервер получает данные через WAN, и клиент, кажется, получает данные, но клиент получает только одно сообщение.Есть ли в глобальной сети что-нибудь, что заставляло бы клиента всегда получать только первое возвращаемое соединение UDP и ничего из последующегоСпасибо за помощь.

Код прослушивания клиента UDP

private void receiveUDP()
    {
        System.Net.IPEndPoint test = new System.Net.IPEndPoint(System.Net.IPAddress.Any,UDP_PORT_NUMBER);
        System.Net.EndPoint serverIP = (System.Net.EndPoint)test;
        server.Bind(serverIP);
        //server.Ttl = 50;

        EndPoint RemoteServ = (EndPoint)listenUDP;
        do
        {
            byte[] content = new byte[1024];
            int data = server.ReceiveFrom(content, ref RemoteServ);

            string message = Encoding.ASCII.GetString(content);


            ProcessCommands(message);


        } while (true);
    }

1 Ответ

1 голос
/ 15 августа 2011

Это что-то вроде удара в темноте (поскольку вы не предоставляете достаточно кода, чтобы действительно сказать, что происходит окончательно), но есть одна главная причина, по которой вы можете постоянно видеть, что некоторые дейтаграммы UDP не доставляются по глобальной сети.в то время как другие всегда прибывают успешно.Эта причина - MTU; Максимальная единица передачи , которую можно отправить в одной дейтаграмме UDP.Это может легко привести к такому поведению, как, например, то, что вы видите, если (например) ваша первая дейтаграмма является коротким сообщением «Я принимаю ваше соединение», а затем вы сопровождаете его дейтаграммами, содержащими большие файлы;первая (маленькая) дейтаграмма меньше, чем MTU, и доставляется, в то время как следующие (большие) дейтаграммы больше, чем MTU, и отбрасываются по пути.

Для UDP по глобальной сети MTU не будетбыть выше, чем около 1500 байт, и во многих ситуациях может быть всего до 1200 байт.Любые пакеты больше этого размера будут молча отбрасываться где-то между конечными точками.Чтобы отправить большие блоки данных через UDP, вам нужно разделить их на куски, меньшие, чем MTU, для сегмента сети, через который вы их передаете.

В локальной сети вы обычно можете избежать отправкидатаграммы любого размера.Но как только они отправляются через Интернет или иным образом через гетерогенные сети, они, скорее всего, будут отбрасываться без уведомления.

Если вам нужно отправить большие файлы, вы можете передать их через TCPвместо;TCP автоматически управляет сортировкой данных в соответствии с MTU и гарантирует, что все его пакеты принимаются и принимаются по порядку;гарантирует, что вы не будете получать дейтаграммы, отправленные через UDP.

Как я уже упоминал выше, это полный удар в темноте и может не иметь никакого отношения к вашим реальным проблемам.Но это слон в комнате, когда все, что нам нужно, это то, что первый пакет всегда приходит успешно, а более поздние пакеты никогда не делают.

...