C # UdpClient не получает - PullRequest
0 голосов
/ 01 июня 2018

У меня возникли некоторые проблемы с System.Net.Socket UdpClient сегодня.Я не уверен, где я иду не так.У меня есть другая конкретная реализация UWP, использующая пространство имен Windows, которая прекрасно работает, но я не могу взломать это.

У меня есть сервер, отправляющий UDP-пакеты моему клиенту с произвольного порта на localPort.Клиент иногда отправляет пакет обратно на remoteHostname:remotePort.Тем не менее, я никогда не получаю никаких этих данных из EndReceive.

. Я вижу на Wireshark (и на моем сервере), что мне правильно удается отправлять пакеты через Send от клиента ксервер, и что сервер действительно отправляет пакеты клиенту с правильным портом назначения (localPort).Любые идеи были бы потрясающими.Вот класс:

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

public class UdpReceiver
{
    private UdpClient Client;
    private AsyncCallback InternalCallback;
    private IPEndPoint Destination;
    private IPEndPoint Listen;
    private bool Transmit = false;

    public UdpReceiver(string remoteHostname, int remotePort, int localPort, int depth)
    {
        Destination = new IPEndPoint(IPAddress.Parse(remoteHostname), remotePort);
        Listen = new IPEndPoint(IPAddress.Any, localPort);

        Client = new UdpClient(localPort);    
        InternalCallback = MakeCallback();
        Client.BeginReceive(InternalCallback, null);
    }

    public void Send(byte[] data)
    {
        if (!Transmit)
        {
            Transmit = true;
            Client.BeginSend(data, data.Length, Destination, InternalCallback, null);
        }
    }

    private AsyncCallback MakeCallback()
    {
        return new AsyncCallback((result) =>
        {
            if (Transmit)
            {
                Client.EndSend(result);
                Transmit = false;
            }
            else
            {
                var data = Client.EndReceive(result, ref Listen);
                System.Diagnostics.Debug.WriteLine("Got some data!");
                Client.BeginReceive(InternalCallback, null);
            }
        });
    }
}
...