首页 > 解决方案 > 响应 UDP 数据报:响应未到达发件人

问题描述

我正在努力实现 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 并在那里发送响应。不幸的是,我不确定如何解决这个问题。有什么建议么?

标签: c#udpclient

解决方案


推荐阅读