Я борюсь с реализацией связи 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, и отправляет ответ туда. К сожалению, я не совсем уверен, как это исправить. Есть предложения?