Ответ на UDP-датаграмму: ответ не достигает отправителя - PullRequest
0 голосов
/ 05 февраля 2020

Я борюсь с реализацией связи UDP. Я пытаюсь создать два экземпляра UdpClient, которые обмениваются некоторой информацией. В настоящее время я нахожусь на этапе, когда client1 (на порту 13006) отправляет байты на client2 (порт 13007), client2 получает их правильно и отправляет информацию обратно, но client1 не получает этот ответ. Оба клиента работают на одном компьютере (я тестирую как интеграционный тест, используя XUnit).

Обе стороны начинают слушать следующим образом:

public override void SetupListener(int port)
{
    udpClient = new UdpClient(port);

    udpClient.BeginReceive(new AsyncCallback(HandleNewConnection), null);
}

Затем client1 отправляет сообщение client2 :

ConnectAsync(IPAddress.Loopback, client2.ListenerPort);

[...]

public override async Task ConnectAsync(IPAddress address, int port)
{
    UdpClientSender = new UdpClient();
    UdpClientSender.Connect(address, port);
    _logger.LogInformation($"({CurrentConnectionId}) Sending ConnectionRequest to {address}:{port}");

    var message = ProtocolHandler.InjectFrame((int)MessageType.ConnectionRequest, null);
    UdpClientSender.Send(bytes, bytes.Length);

    BeginReading();
}

И сразу начинает слушать:

public override void BeginReading()
{
    Thread _thread = new Thread(() =>
    {
        UdpClientSender.BeginReceive(new AsyncCallback(HandleRead), null);
    });
    _thread.Start();
}

client2 правильно получает сообщение и вызывает эту функцию:

protected override Task WriteToNetworkStream(byte[] bytes)
{
    _logger.LogDebug($"({CurrentConnectionId}) Sending. LocalEndpoint: {UdpClientSender.Client.LocalEndPoint}");
    _logger.LogDebug($"({CurrentConnectionId}) Sending. RemoteEndpoint: {UdpClientSender.Client.RemoteEndPoint}");
    UdpClientSender.Send(bytes, bytes.Length);

    return Task.CompletedTask;
}

Но ответное сообщение не достичь client1.

Я думаю, проблема заключается в переводе порта. client1 отправляет сообщение на порт 13007 (который является надлежащим портом client2 и именно поэтому оно отправляется правильно), но client2, получая сообщение, видит, что оно пришло с порта 59464, и отправляет ответ туда. К сожалению, я не совсем уверен, как это исправить. Есть предложения?

...